環境:Elasticsearch 6.2.4 + Kibana 6.2.4 + ik 6.2.4html
Elasticsearch默認也能對中文進行分詞。java
咱們先來看看自帶的中文分詞效果:git
curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json;' -d '{"analyzer": "default","text": "今每天氣真好"}'
GET /_analyze { "analyzer": "default", "text": "今每天氣真好" }
結果:github
{ "tokens": [ { "token": "今", "start_offset": 0, "end_offset": 1, "type": "<IDEOGRAPHIC>", "position": 0 }, { "token": "天", "start_offset": 1, "end_offset": 2, "type": "<IDEOGRAPHIC>", "position": 1 }, { "token": "天", "start_offset": 2, "end_offset": 3, "type": "<IDEOGRAPHIC>", "position": 2 }, { "token": "氣", "start_offset": 3, "end_offset": 4, "type": "<IDEOGRAPHIC>", "position": 3 }, { "token": "真", "start_offset": 4, "end_offset": 5, "type": "<IDEOGRAPHIC>", "position": 4 }, { "token": "好", "start_offset": 5, "end_offset": 6, "type": "<IDEOGRAPHIC>", "position": 5 } ] }
咱們發現,是按照每一個字進行分詞的。這種在實際應用裏確定達不到想要的效果。固然,若是是日誌搜索,使用自帶的就足夠了。正則表達式
analyzer=default
其實調用的是standard
分詞器。算法
接下來,咱們安裝IK分詞插件進行分詞。json
IK項目地址:https://github.com/medcl/elasticsearch-analysis-ikbash
首先須要說明的是,IK插件必須和 ElasticSearch 的版本一致,不然不兼容。app
安裝方法1:
從 https://github.com/medcl/elasticsearch-analysis-ik/releases 下載壓縮包,而後在ES的plugins
目錄建立analysis-ik
子目錄,把壓縮包的內容複製到這個目錄裏面便可。最終plugins/analysis-ik/
目錄裏面的內容:curl
plugins/analysis-ik/ commons-codec-1.9.jar commons-logging-1.2.jar elasticsearch-analysis-ik-6.2.4.jar httpclient-4.5.2.jar httpcore-4.4.4.jar plugin-descriptor.properties
而後重啓 ElasticSearch。
安裝方法2:
./usr/local/elk/elasticsearch-6.2.4/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.4/elasticsearch-analysis-ik-6.2.4.zip
若是已下載壓縮包,直接使用:
./usr/local/elk/elasticsearch-6.2.4/bin/elasticsearch-plugin install file:///tmp/elasticsearch-analysis-ik-6.2.4.zip
而後重啓 ElasticSearch。
IK支持兩種分詞模式:
接下來,咱們測算IK分詞效果和自帶的有什麼不一樣:
curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "ik_smart","text": "今每天氣真好"}'
結果:
{ "tokens": [ { "token": "今每天氣", "start_offset": 0, "end_offset": 4, "type": "CN_WORD", "position": 0 }, { "token": "真好", "start_offset": 4, "end_offset": 6, "type": "CN_WORD", "position": 1 } ] }
再試一下ik_max_word
的效果:
{ "tokens": [ { "token": "今每天氣", "start_offset": 0, "end_offset": 4, "type": "CN_WORD", "position": 0 }, { "token": "今天", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 1 }, { "token": "每天", "start_offset": 1, "end_offset": 3, "type": "CN_WORD", "position": 2 }, { "token": "天氣", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 3 }, { "token": "真好", "start_offset": 4, "end_offset": 6, "type": "CN_WORD", "position": 4 } ] }
示例:
{ "properties": { "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" } } }
注:這裏設置 search_analyzer
與 analyzer
相同是爲了確保搜索時和索引時使用相同的分詞器,以確保查詢中的術語與反向索引中的術語具備相同的格式。若是不設置 search_analyzer
,則 search_analyzer
與 analyzer
相同。詳細請查閱:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html
防盜版聲明:本文系原創文章,發佈於公衆號飛鴻影的博客
(fhyblog)及博客園,轉載需做者贊成。
咱們也能夠定義本身的詞典供IK使用。好比:
curl -XGET "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "ik_smart","text": "去朝陽公園"}'
結果:
{ "tokens": [ { "token": "去", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "朝陽", "start_offset": 1, "end_offset": 3, "type": "CN_WORD", "position": 1 }, { "token": "公園", "start_offset": 3, "end_offset": 5, "type": "CN_WORD", "position": 2 } ] }
咱們但願朝陽公園
做爲一個總體,這時候能夠把該詞加入到本身的詞典裏。
新建本身的詞典只須要簡單幾步就能夠完成:
一、在elasticsearch-6.2.4/config/analysis-ik/
目錄增長一個my.dic
:
$ touch my.dic $ echo 朝陽公園 > my.dic $ cat my.dic 朝陽公園
.dic
爲詞典文件,其實就是簡單的文本文件,詞語與詞語直接須要換行。注意是UTF8編碼。咱們看一下自帶的分詞文件:
$ head -n 5 main.dic 一一列舉 一一對應 一一道來 一丁 一丁不識
二、而後修改elasticsearch-6.2.4/config/analysis-ik/IKAnalyzer.cfg.xml
文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment> <!--用戶能夠在這裏配置本身的擴展字典 --> <entry key="ext_dict">my.dic</entry> <!--用戶能夠在這裏配置本身的擴展中止詞字典--> <entry key="ext_stopwords"></entry> <!--用戶能夠在這裏配置遠程擴展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用戶能夠在這裏配置遠程擴展中止詞字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
增長了my.dic
,而後重啓ES。咱們再看一下效果:
GET /_analyze { "analyzer": "ik_smart", "text": "去朝陽公園" }
結果:
{ "tokens": [ { "token": "去", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "朝陽公園", "start_offset": 1, "end_offset": 5, "type": "CN_WORD", "position": 1 } ] }
說明自定義詞典生效了。若是有多個詞典,使用英文分號隔開:
<entry key="ext_dict">my.dic;custom/single_word_low_freq.dic</entry>
另外,咱們看到配置裏還有個擴展中止詞字典
,這個是用來輔助斷句的。咱們能夠看一下自帶的一個擴展中止詞字典
:
$ head -n 5 extra_stopword.dic 也 了 仍 從 以
也就是IK分詞器遇到這些詞就認爲前面的詞語不會與這些詞構成詞語。
IK分詞也支持遠程詞典,遠程詞典的好處是支持熱更新。詞典格式和本地的一致,都是一行一個分詞(換行符用 \n
),還要求填寫的URL知足:
該 http 請求須要返回兩個頭部(header),一個是 Last-Modified,一個是 ETag,這二者都是字符串類型,只要有一個發生變化,該插件就會去抓取新的分詞進而更新詞庫。
詳見:https://github.com/medcl/elasticsearch-analysis-ik 熱更新 IK 分詞使用方法 部分。
注意:上面的示例裏咱們改的是`
elasticsearch-6.2.4/config/analysis-ik/
目錄下內容,是由於IK是經過方法2裏elasticsearch-plugin
安裝的。若是你是經過解壓方式安裝的,那麼IK配置會在plugins目錄,即:elasticsearch-6.2.4/plugins/analysis-ik/config
。也就是說插件的配置既能夠放在插件所在目錄,也能夠放在Elasticsearch的config目錄裏面。
es自帶了許多內置的Analyzer分析器,無需配置就能夠直接在index中使用:
詳見文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html
一、medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.
https://github.com/medcl/elasticsearch-analysis-ik
二、ElesticSearch IK中文分詞使用詳解 - xsdxs的博客 - CSDN博客
https://blog.csdn.net/xsdxs/article/details/72853288