天天看點

Elasticsearch之安裝ik分詞插件IK簡介安裝測試案例IK配置說明熱更新 IK 分詞使用方法

IK簡介

IK Analyzer是一個開源的,基于java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始, IKAnalyzer已經推出了4個大版本。最初,它是以開源項目Luence為應用主體的,結合詞典分詞和文法分析算法的中文分詞元件。從3.0版本開 始,IK發展為面向Java的公用分詞元件,獨立于Lucene項目,同時提供了對Lucene的預設優化實作。在2012版本中,IK實作了簡單的分詞 歧義排除算法,标志着IK分詞器從單純的詞典分詞向模拟語義分詞衍化。

IK Analyzer 2012特性:

- 采用了特有的“正向疊代最細粒度切分算法“,支援細粒度和智能分詞兩種切分模式;

- 在系統環境:Core2 i7 3.4G雙核,4G記憶體,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。

- 2012版本的智能分詞模式支援簡單的分詞排歧義處理和數量詞合并輸出。

- 采用了多子處理器分析模式,支援:英文字母、數字、中文詞彙等分詞處理,相容韓文、日文字元

- 優化的詞典存儲,更小的記憶體占用。支援使用者詞典擴充定義。特别的,在2012版本,詞典支援中文,英文,數字混合詞語。

安裝

  1. 編譯打包
# 克隆遠端庫到本地
$ git clone https://github.com/medcl/elasticsearch-analysis-ik
$ cd elasticsearch-analysis-ik

# 檢視tag清單
$ git tag

# 檢出與elasticsearch版本相比對的版本
$ git checkout tags/{version}

# 打包
$ mvn clean
$ mvn compile
$ mvn package
           
  1. 手動安裝
# 解壓到plugins/ik目錄
$ unzip target/releases/elasticsearch-analysis-ik-{version}.zip ES_HOME/plugins/ik
           

注意:

- ES_HOME為ES對應安裝目錄

- version為選擇的ik版本号

  1. 重新開機elasticsearch

備注:

- ik_max_word: 會将文本做最細粒度的拆分,比如會将“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;

- ik_smart: 會做最粗粒度的拆分,比如會将“中華人民共和國國歌”拆分為“中華人民共和國,國歌”。

測試案例

  1. 建立索引
curl -XPUT http://localhost:/index
           
  1. 建立mapping
curl -XPOST http://localhost:/index/fulltext/_mapping -d'
{
    "fulltext": {
             "_all": {
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_max_word",
            "term_vector": "no",
            "store": "false"
        },
        "properties": {
            "content": {
                "type": "string",
                "store": "no",
                "term_vector": "with_positions_offsets",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word",
                "include_in_all": "true",
                "boost": 8
            }
        }
    }
}'
           
  1. 插入測試資料
curl -XPOST http://localhost:/index/fulltext/ -d'
{"content":"美國留給伊拉克的是個爛攤子嗎"}
'
           
curl -XPOST http://localhost:/index/fulltext/ -d'
{"content":"公安部:各地校車将享最高路權"}
'
           
curl -XPOST http://localhost:/index/fulltext/ -d'
{"content":"中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"}
'
           
curl -XPOST http://localhost:/index/fulltext/ -d'
{"content":"中國駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首"}
'
           
  1. 查詢并高亮關鍵詞
curl -XPOST http://localhost:/index/fulltext/_search  -d'
{
    "query" : { "term" : { "content" : "中國" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}
'
           

傳回結果

{
    "took": ,
    "timed_out": false,
    "_shards": {
        "total": ,
        "successful": ,
        "failed": 
    },
    "hits": {
        "total": ,
        "max_score": ,
        "hits": [
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "4",
                "_score": ,
                "_source": {
                    "content": "中國駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首"
                },
                "highlight": {
                    "content": [
                        "<tag1>中國</tag1>駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首 "
                    ]
                }
            },
            {
                "_index": "index",
                "_type": "fulltext",
                "_id": "3",
                "_score": ,
                "_source": {
                    "content": "中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"
                },
                "highlight": {
                    "content": [
                        "均每天扣1艘<tag1>中國</tag1>漁船 "
                    ]
                }
            }
        ]
    }
}
           

IK配置說明

plugins/elasticsearch-analysis-ik-*/config/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">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
     <!--使用者可以在這裡配置自己的擴充停止詞字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
    <!--使用者可以在這裡配置遠端擴充字典 -->
    <entry key="remote_ext_dict">location</entry>
    <!--使用者可以在這裡配置遠端擴充停止詞字典-->
    <entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>
           

熱更新 IK 分詞使用方法

目前該插件支援熱更新 IK 分詞,通過上文在 IK 配置檔案中提到的如下配置

<!--使用者可以在這裡配置遠端擴充字典 -->
    <entry key="remote_ext_dict">location</entry>
    <!--使用者可以在這裡配置遠端擴充停止詞字典-->
    <entry key="remote_ext_stopwords">location</entry>
           

其中

location

是指一個 url,比如

http://yoursite.com/getCustomDict

,該請求隻需滿足以下兩點即可完成分詞熱更新。

  1. 該 http 請求需要傳回兩個頭部(header),一個是

    Last-Modified

    ,一個是

    ETag

    ,這兩者都是字元串類型,隻要有一個發生變化,該插件就會去抓取新的分詞進而更新詞庫。
  2. 該 http 請求傳回的内容格式是一行一個分詞,換行符用

    \n

    即可。

滿足上面兩點要求就可以實作熱更新分詞了,不需要重新開機 ES 執行個體。

可以将需自動更新的熱詞放在一個 UTF-8 編碼的 .txt 檔案裡,放在 nginx 或其他簡易 http server 下,當 .txt 檔案修改時,http server 會在用戶端請求該檔案時自動傳回相應的 Last-Modified 和 ETag。可以另外做一個工具來從業務系統提取相關詞彙,并更新這個 .txt 檔案。

常見問題

  1. 自定義詞典為什麼沒有生效?

    請確定你的擴充詞典的文本格式為 UTF8 編碼

  2. 設定elasticsearch預設分詞為ik:在

    ES_HOME/config/elasticsearch.yml

    檔案最後一行中增加

    index.analysis.analyzer.default.type: ik

    即可。
  3. 分詞測試失敗 請在某個索引下調用analyze接口測試,而不是直接調用analyze接口 如:http://localhost:9200/your_index/_analyze?text=中華人民共和國MN&tokenizer=my_ik

繼續閱讀