ElasticSearch ik分詞器擴充詞庫遇到的坑

博主使用了ik分詞器作爲搜索服務中文分詞器。ik分詞器支持擴充詞庫,具體方法這裏不提,大家自行google。

這裏記錄在擴充詞庫後大家容易遇到的坑,因爲我就遇到了。

在擴充完詞庫後,搜索詞的分詞會使用到擴展的詞庫,一般我們使用ik_smart以匹配最長的詞,讓結果更精準。這裏舉個例子。擴充詞庫里加了阿莫西林膠囊。擴充詞庫之前,阿莫西林膠囊使用ik_smart會被分詞爲[阿莫西林,膠囊],擴充完詞庫後,會變成分詞爲[阿莫西林膠囊]。

一般我們用ik_max_word來作爲索引文檔的分詞器,以能匹配到更多的搜索關鍵字。我們用ik_max_word 來分詞藥品名稱阿莫西林膠囊,在擴展詞庫之前它會被分成[阿莫西林、莫西、西林、膠囊],擴展詞庫之後它會被分爲[阿莫西林、莫西、西林、膠囊、阿莫西林膠囊]。所以以下命令搜索是能夠匹配到product_name爲阿莫西林膠囊的文檔的。

GET product/_search
{
  "query": {
    "match": {
      "product_name": "阿莫西林膠囊"
    }
  }
}

然而,擴充完詞庫後,無法匹配了。後來想到是搜索詞使用了擴充詞庫被分詞成了 [阿莫西林膠囊],但是索引的文檔沒有更新。所以需要更新索引文檔。

可以使用_update_by_query API完成,這個命令不會修改 _source而更新文檔。

POST product/_update_by_query?conflicts=proceed

它還支持同時更新多個索引和類型

POST index1,index2,index3/type1,type2,type3/_update_by_query?conflicts=proceed

_update_by_query 在開始時獲取一個索引的快照。當快照的版本和索引版本一致時則進行更新,並且遞增文檔版本號。

如果在獲取快照之後,該文檔被修改了就會遇到衝突。衝突默認情況會導致更新過程終止,之前的更新不會回滾。如果不想因爲衝突導致整個更新過程終止,可以在url中添加參數conflicts=proceed。

以上,大家在擴展詞庫之後不要忘記更新索引數據哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章