1. 程式人生 > >Elasticsearch5.x安裝IK分詞器以及使用

Elasticsearch5.x安裝IK分詞器以及使用

Elasticsearch中,內建了很多分詞器(analyzers),例如standard (標準分詞器)、english (英文分詞)和chinese (中文分詞)。其中standard 就是無腦的一個一個詞(漢字)切分,所以適用範圍廣,但是精準度低;english 對英文更加智慧,可以識別單數負數,大小寫,過濾stopwords(例如“the”這個詞)等;chinese 效果很差;

1、elasticsearch官方預設的分詞外掛,對中文分詞效果不理想。例如:

# curl 'http://172.16.32.69:9200/_analyze?pretty=true' -d '{"text":"這裡是好記性不如爛筆頭感嘆號的部落格園"}'

{
  "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
    }
    ........
  ]
}

總結

     如果直接使用Elasticsearch在處理中文內容的搜尋時,中文詞語被分成了一個一個的漢字,這是因為使用了Elasticsearch中預設的標準分詞器,這個分詞器在處理中文的時候會把中文單詞切分成一個一個的漢字,因此引入es之中文的分詞器外掛es-ik就能解決這個問題。

為何使用IK分詞器?

    比如“西紅柿”,按預設的標準分詞器搜尋“西西”、“西天”等都能出現西紅柿的結果,此時對於電商而言搜尋效果不理想,而按IK分詞器搜尋“西西”、“西天”等搜尋結果為空

如何整合IK分詞工具

第一步:下載es的IK外掛:https://github.com/medcl/elasticsearch-analysis-ik/releases

選擇對應的版本,IK版本與ES版本一致,建議直接    下載編譯後的zip包;若是下載原始碼包,則需要自己編碼打包mvn clean package生成zip包)如圖:

第二步:將下載的zip包(或自己編譯後的包)拷貝至ES_HOME/plugins/ik(ps:ik目錄沒有的話自己新建一個就好),然後使用unzip命令解壓

第四步:測試分詞效果:

#curl 'http://172.16.32.48:9200/_analyze?analyzer=ik_max_word&pretty=true' -d '{"text":"這裡是好記性不如爛筆頭感嘆號的部落格們"}'

出現以下情況,說明IK分詞器安裝生效。

{
  "tokens" : [
    {
      "token" : "這裡是",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "這裡",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "裡",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "好記",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "記性",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 4
    }
    ........
  ]
}

IK分詞器使用

首先確保IK外掛安裝成功(安裝文件:http://blog.csdn.net/wwd0501/article/details/78258274),然後在建立mapping時,設定IK分詞器,設定analyzer和search_analyzer;在java api搜尋中將不用再關注IK分詞器的事情,原有程式碼可以不做任何修改。例:

1.create a index

curl -XPUT http://localhost:9200/class

2.create a mapping

curl -XPOST http://localhost:9200/class/student/_mapping -d'
{
    "student": {
        "properties": {
            "name": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            },
            "age": {
                "type": "long"
            }
        }
    }
}'

3.index some docs

curl -XPOST http://localhost:9200/class/student/1 -d'
{"name":"菠菜","age":"10"}
'
curl -XPOST http://localhost:9200/class/student/2 -d'
{"name":"芹菜","age":"65"}'
curl -XPOST http://localhost:9200/class/student/3 -d'
{"name":"大蘿蔔 大菠菜","age":"89"}
'


4.query

curl -XPOST http://localhost:9200/class/student/_search  -d'
{
    "query" : { "match" : { "name" : "芹菜" } }
}
'

Result

{

  • "took": 3,
  • "timed_out": false,
  • "_shards": {
    • "total": 5,
    • "successful": 5,
    • "failed": 0
    },
  • "hits": {
    • "total": 1,
    • "max_score": 0.25316024,
    • "hits": [
      • {
        • "_index": "class",
        • "_type": "student",
        • "_id": "1",
        • "_score": 0.25316024,
        • "_source": {
          • "name": "芹菜",
          • "age": "10"
          }
        }
      ]
    }

}

注意:

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

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

其中我們在做索引的時候,希望能將所有的句子切分的更詳細,以便更好的搜尋,所以ik_max_word更多的用在做索引的時候,但是在搜尋的時候,對於使用者所輸入的query(查詢)詞,我們可能更希望得比較準確的結果,例如,我們搜尋“無花果”的時候,更希望是作為一個詞進行查詢,而不是切分為"無",“花”,“果”三個詞進行結果的召回,因此ik_smart更加常用語對於輸入詞的分析