1. 程式人生 > >Elasticsearch中的分詞介紹

Elasticsearch中的分詞介紹

1、概述
在我們初次使用Elasticsearch查詢的時候,有時會很困惑,為什麼我儲存的一段String資料,卻查詢不到?為什麼輸入了漢語單詞,只能一個字一個字的匹配?等這些都與是否分詞、使用什麼分詞器有關。

1.1 分詞概念
首先說說什麼是分詞器吧! 比如“分詞介紹”:
如果是標準分詞器,會把它拆分成“分”,“詞”,“介”,“紹”。
如果使用一些漢語的分詞器,則會分析成“分詞”,“介紹”。

由於倒排索引都是以詞term為索引的,因此如果分解成了一個一個的詞,查詢“分詞”的時候,分詞也會被分解成“分”,“詞”,這樣就可能誤查到”中文分詞“等之類的詞。

1.2 關於String型別——分詞與不分詞


在Elasticsearch中String是最基本的資料型別,如果不是數字或者標準格式的日期等這種很明顯的型別,其他的一般都會優先預設儲存成String。我們這裡使用ik中文分詞。

2、安裝中文分詞ik
Elasticsearch的中文分詞很爛,所以我們需要安裝ik中文分詞。首先可以從github上下載專案(https://github.com/medcl/elasticsearch-analysis-ik/),解壓之後打成jar包,將jar包複製到Elasticsearch的plugins/目錄下,再把解壓出的ik目錄(配置和詞典等),複製到Elasticsearch的config 目錄下。然後編輯配置檔案elasticsearch.yml,在後面加:

index.analysis.analyzer.default.type: ik

重啟elasticsearch搞定。

3、檢視ElasticSearch的分詞
3.1 叢集級分詞的定義
叢集級的分詞定義是在conf目錄下的elasticsearch.yml檔案裡定義,內容大致如下:

index.analysis.analyzer.ik.type : "ik"

3.2 特定index的分詞
3.2.1 在定義analyze之前,先關閉index。其實並不需要關閉也可以生效,但是為了資料一致性考慮,還是先執行關閉。

curl -XPOST http://localhost:9400/index_test/_close

然後執行:

curl -XPUT localhost:9400/index_test/_settings -d '
{
   "analysis": {
      "analyzer":{
             "ikAnalyzer":{
                 "type":"org.elasticsearch.index.analysis.IkAnalyzerProvider",
                    "alias":"ik"
                }
            }
     }
}'

最後開啟index:

curl -XPOST http://localhost:9400/index_test/_open

到此為止一個新的型別的分詞器就定義好了。

4、分詞對於查詢的影響
4.1 對於分詞的欄位
(1)如果查詢的是單個詞,則查詢到包含它的文件,返回結果與匹配程度有關
(2)如果查詢的是多個詞即一段能被分析的詞,比如hello world。那麼查詢的結果是包含分析得出的詞的文件,包含hello或world的全部文件。

4.2 對於不分詞的欄位
只有查詢的是目標欄位的精確值,才能匹配。比如hello world,必須查詢hello world,才可以找到文件。