博主使用了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。
以上,大家在擴展詞庫之後不要忘記更新索引數據哦~