一、ES分词器简介
ES(Elastic Search)是一个基于 Lucene 的搜索服务器,它提供了一个分布式、多租户的全文搜索引擎。
ES 分词器是其中的一个核心部分,它负责将用户输入的查询文本分成若干个词语,建立索引,并根据词语出现的频率和位置等信息为搜索结果排序。ES 分词器支持多种语言的分词,也支持自定义分词规则和引入第三方分词插件。
/** * 自定义 ES 分词器 */ PUT my_index { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "standard", "filter": [ "lowercase", "stop", "stemmer" ] } }, "filter": { "stop": { "type": "stop", "stopwords": "_english_" }, "stemmer": { "type": "stemmer", "name": "english" } } } } }
二、ES 分词器优势
ES 分词器不仅可以提高搜索速度和准确率,还可以为网站流量的优化和提升做出很大的贡献。
1.提高搜索准确率
ES 分词器支持细粒度的分词规则和词典,可以根据不同的场景选择匹配度更高的分词方案。同时,可以利用分析器和过滤器等工具对分词结果进行字形还原、同义词替换、停用词过滤等优化,从而提高搜索结果的准确度。
2.优化搜索体验
ES 分词器支持实时搜索和搜索建议功能,可以根据用户输入的实时搜索结果进行智能提示,提高搜索效率和用户体验。同时,可以根据搜索热度和用户历史搜索数据等信息为搜索结果进行个性化排序,满足用户不同需求和偏好。
3.增加搜索流量
ES 分词器可以为网站的搜索引擎优化(SEO)做出贡献。在建立索引的过程中,可以对重要关键词进行分词,建立词库和标签,使得搜索引擎可以更好地识别和索引网站的内容,提高排名和流量。
三、ES 分词器实践
下面是一个使用 ES 分词器的示例代码,它可以从指定的文本文件中读取数据,建立索引,并实现分词和搜索功能。
/** * ES 分词器示例代码 */ import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; public class ESExample { private static final String INDEX_NAME = "my_index"; private static final String TYPE_NAME = "my_type"; private static Client client; /** * 初始化 ES 客户端 */ public static void init() { Settings settings = Settings.settingsBuilder() .put("cluster.name", "my_cluster") .build(); try { client = TransportClient.builder().settings(settings).build() .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); } catch (UnknownHostException e) { e.printStackTrace(); } } /** * 建立索引 */ public static void index(String fileName) { try { BufferedReader br = new BufferedReader(new FileReader(new File(fileName))); String line; while ((line = br.readLine()) != null) { XContentBuilder builder = XContentFactory.jsonBuilder() .startObject() .field("content", line) .endObject(); IndexResponse response = client.prepareIndex(INDEX_NAME, TYPE_NAME) .setSource(builder) .get(); } br.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("Indexing completed."); } /** * 搜索 */ public static void search(String searchText) { SearchResponse response = client.prepareSearch(INDEX_NAME) .setTypes(TYPE_NAME) .setQuery(QueryBuilders.matchQuery("content", searchText)) .get(); System.out.println("Total hits: " + response.getHits().getTotalHits()); for (SearchHit hit : response.getHits().getHits()) { System.out.println("Score: " + hit.getScore() + ", Content: " + hit.getSource().get("content")); } } /** * 关闭 ES 客户端 */ public static void destroy() { client.close(); } public static void main(String[] args) { init(); index("data.txt"); search("ES 分词器"); destroy(); } }