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