1. 程式人生 > >使用 Elasticsearch ik分詞實現同義詞搜尋

使用 Elasticsearch ik分詞實現同義詞搜尋

1、首先需要安裝好Elasticsearch 和elasticsearch-analysis-ik分詞器

2、配置ik同義詞

Elasticsearch 自帶一個名為 synonym 的同義詞 filter。為了能讓 IK 和 synonym 同時工作,我們需要定義新的 analyzer,用 IK 做 tokenizer,synonym 做 filter。聽上去很複雜,實際上要做的只是加一段配置。

開啟 /config/elasticsearch.yml 檔案,加入以下配置:

index:
  analysis:
    analyzer:
      ik_syno:
          type: custom
          tokenizer: ik_max_word
          filter: [my_synonym_filter]
      ik_syno_smart:
          type: custom
          tokenizer: ik_smart
          filter: [my_synonym_filter]
    filter:
      my_synonym_filter:
          type: synonym
          synonyms_path: analysis/synonym.txt

以上配置定義了 ik_syno 和 ik_syno_smart 這兩個新的 analyzer,分別對應 IK 的 ik_max_word 和 ik_smart 兩種分詞策略。根據 IK 的文件,二者區別如下:

  • ik_max_word:會將文字做最細粒度的拆分,例如「中華人民共和國國歌」會被拆分為「中華人民共和國、中華人民、中華、華人、人民共和國、人民、人、民、共和國、共和、和、國國、國歌」,會窮盡各種可能的組合;
  • ik_smart:會將文字做最粗粒度的拆分,例如「中華人民共和國國歌」會被拆分為「中華人民共和國、國歌」;
ik_syno 和 ik_syno_smart 都會使用 synonym filter 實現同義詞轉換。

3、建立/config/analysis/synonym.txt 檔案,輸入一些同義詞並存為 utf-8 格式。例如


到此同義詞配置已經完成,重啟ES即可,搜尋時指定分詞為ik_syno或ik_syno_smart。

建立Mapping對映。執行curl命令如下

curl -XPOST  http://192.168.1.99:9200/goodsindex/goods/_mapping -d'{
  "goods": {
    "_all": {
      "enabled": true,
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word",
      "term_vector": "no",
      "store": "false"
    },
    "properties": {
      "title": {
        "type": "string",
        "term_vector": "with_positions_offsets",
        "analyzer": "ik_syno",
        "search_analyzer": "ik_syno"
      },
      "content": {
        "type": "string",
        "term_vector": "with_positions_offsets",
        "analyzer": "ik_syno",
        "search_analyzer": "ik_syno"
      },
      "tags": {
        "type": "string",
        "term_vector": "no",
        "analyzer": "ik_syno",
        "search_analyzer": "ik_syno"
      },
      "slug": {
        "type": "string",
        "term_vector": "no"
      },
      "update_date": {
        "type": "date",
        "term_vector": "no",
        "index": "no"
      }
    }
  }
}'
以上程式碼為 test 索引下的 article 型別指定了欄位特徵: title 、 content 和 tags 欄位使用 ik_syno 做為 analyzer,說明它使用 ik_max_word 做為分詞,並且應用 synonym 同義詞策略; slug 欄位沒有指定 analyzer,說明它使用預設分詞;而 update_date 欄位則不會被索引。