Elasticsearch:用于内容丰富的文本分析
每個文本搜索解決方案都與其提供的文本分析功能一樣強大。 Lucene是這樣的開源信息檢索庫,提供了許多文本分析的可能性。 在本文中,我們將介紹ElasticSearch提供的一些主要文本分析功能,這些功能可用來豐富您的搜索內容。
內容豐富
以一個典型的電子商務站點為例,向最終客戶提供正確的搜索內容對于企業非常重要。 任何搜索解決方案提供的文本分析策略在其中都扮演著非常重要的角色。 作為搜索用戶,我希望查詢能夠自動返回一些典型的搜索行為,
- 應該尋找與我的查詢文字相符的同義詞
- 應匹配單詞和復數個單詞或聽起來相似的單詞以輸入查詢文本
- 不應允許搜索受保護的單詞
- 應該允許搜索包含數字或特殊字符的單詞
- 不應允許搜索html標簽
- 應該允許根據字母的接近度和匹配字母的數量搜索文本
在這里豐富內容將是在為內容建立索引和搜索時,向您的內容添加上述搜索功能。
Lucene文字分析
Lucene是信息檢索 (IR),允許全文索引和搜索功能。 為了快速參考,請檢查Lucene中的文本分析 。 在Lucene中,文檔包含“文本”字段。 分析是將字段文本進一步轉換為術語的過程。 這些術語用于匹配搜索查詢。 整個分析過程共有三種主要實現,
- 分析器:分析器負責構建TokenStream,可由索引和搜索過程使用。
- 標記生成器:一個標記是一個的TokenStream并負責分手傳入的文本為標記。 在大多數情況下,分析器將使用令牌生成器作為分析過程的第一步。
- TokenFilter: TokenFilter也是TokenStream,負責修改由Tokenizer創建的Token。
分析器內部TokenStreams和TokenFilters的常用用法是使用鏈接模式,該模式可讓您從簡單的Tokenizer / TokenFilter構建塊構建復雜的分析器。 令牌生成器通過將輸入的字符劃分為令牌來啟動分析過程(大多數這些令牌對應于原始文本中的單詞)。 然后,TokenFilters接管其余的分析工作,首先包裝Tokenizer,然后依次包裝嵌套的TokenFilters。
ElasticSearch文本分析
ElasticSearch使用Lucene內置的文本分析功能,可讓您豐富搜索內容。 如上所述,文本分析分為過濾器,標記器和分析器。 ElasticSearch為您提供了一些內置的分析器,這些分析器帶有預配置的標記生成器和過濾器。 有關現有分析儀的詳細列表,請檢查分析的完整列表
更新分析設置
ElasticSearch允許您動態更新索引設置和映射。 要從Java api客戶端更新索引設置,
Settings settings = settingsBuilder().loadFromSource(jsonBuilder().startObject()//Add analyzer settings.startObject("analysis").startObject("filter").startObject("test_filter_stopwords_en").field("type", "stop").field("stopwords_path", "stopwords/stop_en").endObject().startObject("test_filter_snowball_en").field("type", "snowball").field("language", "English").endObject().startObject("test_filter_worddelimiter_en").field("type", "word_delimiter").field("protected_words_path", "worddelimiters/protectedwords_en").field("type_table_path", "typetable").endObject().startObject("test_filter_synonyms_en").field("type", "synonym").field("synonyms_path", "synonyms/synonyms_en").field("ignore_case", true).field("expand", true).endObject().startObject("test_filter_ngram").field("type", "edgeNGram").field("min_gram", 2).field("max_gram", 30).endObject().endObject().startObject("analyzer").startObject("test_analyzer").field("type", "custom").field("tokenizer", "whitespace").field("filter", new String[]{"lowercase","test_filter_worddelimiter_en","test_filter_stopwords_en","test_filter_synonyms_en","test_filter_snowball_en"}).field("char_filter", "html_strip").endObject().endObject().endObject().endObject().string()).build();CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName); createIndexRequestBuilder.setSettings(settings);您還可以在配置文件中設置索引和設置。 上例中提到的路徑是相對于已安裝elasticsearch服務器的config目錄的。 上面的示例允許您為索引創建自定義過濾器和分析器,ElasticSearch具有不同過濾器和標記器的現有組合,允許您為數據選擇正確的組合。
同義字
同義詞是具有相同或相似含義的詞。 同義詞擴展是在這里我們使用單詞的變體,并在建立索引和/或查詢時將其分配給搜索引擎。 向索引設置添加同義詞過濾器。
.startObject("test_filter_synonyms_en").field("type", "synonym").field("synonyms_path", "synonyms/synonyms_en").field("ignore_case", true).field("expand", true) .endObject()檢查同義詞過濾器以獲取完整的語法。 您可以添加Slor或WordNet格式的同義詞。 查看Slor同義詞格式以獲取更多示例,
# If expand==true, "ipod, i-pod, i pod" is equivalent to the explicit mapping: ipod, i-pod, i pod => ipod, i-pod, i pod # If expand==false, "ipod, i-pod, i pod" is equivalent to the explicit mapping: ipod, i-pod, i pod => ipod在單詞表中查找符合您要求的單詞和同義詞列表。
抽干
詞干定義為包含詞變體的能力。 例如,任何名詞詞都將包含變體(其重要性與變體的程度成正比)。對于詞干,我們使用語法規則的量化方法來添加詞干,并根據詞干與詞根的分離程度對其進行排序字。 將詞干過濾器添加到索引的設置。
.startObject("test_filter_snowball_en").field("type", "snowball").field("language", "English") .endObject()有關詳細信息,請檢查Snowball過濾器語法。 阻止程序通常稱為阻止算法或阻止程序。 Lucene分析可以基于算法或基于字典。 雪球 ,基于馬丁波特的雪球算法提供所產生的功能,并用作在上面的例子中詞干。 檢查雪球莖桿的列表以獲取受支持的不同語言。 同義詞和詞干有時會根據文本處理的順序返回奇怪的結果。 確保按照您的要求使用兩者。
停用詞
停用詞是您不希望用戶索引或查詢的單詞列表。 要將停用詞過濾器添加到設置中,
.startObject("test_filter_stopwords_en").field("type", "stop").field("stopwords_path", "stopwords/stop_en") .endObject()檢查停用詞filter的完整語法。 檢查英語的Snowball 停用詞列表以獲取您自己的列表。 檢查Solr共享的英語停用詞列表。
字定界符
單詞定界符過濾器使您可以將單詞拆分為子單詞,以對子單詞進行進一步處理。 要將字定界符過濾器添加到設置中,
.startObject("test_filter_worddelimiter_en").field("type", "word_delimiter").field("protected_words_path", "worddelimiters/protectedwords_en").field("type_table_path", "typetable") .endObject()常見的單詞拆分基于非字母數字性質,大小寫轉換和單詞內定界符等。檢查Word Delimiter Filter的完整語法和不同的可用選項。 受保護單詞列表使您可以保護業務相關單詞免于在過程中被分隔。
克
N-gram是給定文本序列的n個字母的連續序列。 要將邊緣ngram過濾器添加到設置中,
.startObject("test_filter_ngram").field("type", "edgeNGram").field("min_gram", 2).field("max_gram", 30) .endObject()根據您的配置,在索引期間,輸入文本將分解為上面配置的多個長度的令牌。 它允許您基于匹配的ngram令牌(也基于接近度)返回結果。 檢查Edge NGram過濾器的詳細語法
HTML Strip字符過濾器
大多數網站都提供應索引HTML內容。 大多數網站都不需要允許對標準html文本進行索引和查詢。 ElasticSearch允許您過濾html標記,這些標記不會被索引,也無法查詢。
.startObject("analyzer").startObject("test_analyzer").field("type", "custom").field("tokenizer", "whitespace").field("filter", new String[]{"lowercase", "test_filter_worddelimiter_en", "test_filter_stopwords_en", "test_filter_synonyms_en", "test_filter_snowball_en"}).field("char_filter", "html_strip").endObject() .endObject() 有關詳細信息,請檢查HTML Strip Char Filter的完整語法。 除了上述常見過濾器外,還有更多可用的過濾器,可讓您根據最終用戶的要求和業務數據以所需的方式豐富搜索內容。
翻譯自: https://www.javacodegeeks.com/2013/05/elasticsearch-text-analysis-for-content-enrichment.html
總結
以上是生活随笔為你收集整理的Elasticsearch:用于内容丰富的文本分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果如何设置手写输入法(苹果如何设置手写
- 下一篇: 智能转账没有访问权限是怎么回事?