一、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(); } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/279021.html