Elasticsearch學習筆記6: 同義詞搜索實現

es的同義詞搜索功能經過自定義分析器實現html

咱們知道 一個 分析器 就是在一個包裏面組合了三種函數的一個包裝器, 三種函數按照順序被執行:app

  1. char_filter 如:emoticons, html_strip等
  2. tokenizer 如:standard, ik_smart等
  3. filter 如:lowercase,english_stop等

char_filter 用於分詞前對原搜索的句子進行處理 tokenizer 用於將搜索的句子分紅多個詞組 filter 用於處理tokenizer輸出的詞組,好比刪除某些詞,修改某些詞,增長某些詞函數

實現同義詞搜索的原理是,自定義filter,處理tokenizer輸出的待搜索詞組時,取出其中詞的同義詞,加入到待搜索的詞組中。code

建立分析器:htm

PUT /synonym
{
	"settings": {
		"analysis": {
			"filter": {
	            "word_sync": {
	                "type": "synonym",
	                "synonyms_path": "analysis/synonyms.txt"
	            }
	        },
	        "analyzer": {
	            "ik_sync_smart": {
	                "filter": [
	                    "word_sync"
	                ],
	                "type": "custom",
	                "tokenizer": "ik_smart"
	            }
	        }
		}	
	}
}

上面的例子在名爲synonym的index下面建立了個名爲ik_sync_smart的分析器,改分析器的tokenizer爲ik_smart, filter爲word_sync. word_sync是自定義filter,這個filter的type是synonym,synonyms_path是指定的同義詞詞典的路徑,這個路徑在config下面,因此咱們須要在config路徑下面增長analysis目錄,裏面增長synonyms.txt文件索引

synonyms.txt文件的格式爲每行爲一組同義詞,每組的同義詞格式由以下兩種:token

  1. 番茄,西紅柿
  2. 番茄,西紅柿 => 西紅柿

第一種狀況下,不管索引番茄或者西紅柿,分析器分析結果的詞組爲['番茄', '西紅柿']ip

第二種狀況下,不管索引番茄或者西紅柿,分析器分析結果的詞組爲['西紅柿']原理

能夠經過搜索

GET /synonym/_analyze?analyzer=ik_sync_smart&text=註冊

查看同義詞結果是否符合需求

而後設置索引數據的mapping時,指定對應搜索字段的analyzer爲自定義的ik_sync_smart便可。

相關文章
相關標籤/搜索