ElasticSearch新增IK擴充套件詞後,讓歷史資料生效方法
阿新 • • 發佈:2019-02-19
問題描述
IK是ES的中文分詞外掛。在IK新增熱詞後,不會去更新歷史資料,即新新增的熱詞只對後續的資料生效。而實際上我們常常需要對歷史資料進行更新。
解決辦法
{
"took": 49616, // 話費時間
"timed_out": false,//是否超時
"total": 123649,//資料總數
"updated": 123649,//更新總數
"deleted": 0,
"batches": 124,//scroll響應數量
"version_conflicts": 0,//版本衝突數量
"noops": 0,
"retries" : {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
- 預設批處理的大小是1000,引數設定如下:
POST twitter/_update_by_query?scroll_size=100
- 其他支援的引數
refresh, wait_for_completion, wait_for_active_shards, and timeout.
BmK-50kZQCuFwvObmFrLrw:27388 是通過第二點查詢出來。
update_by_query原理
開始時獲取一個索引的快照,並且使用內部版本來號來進行更新。這意味著如果文件在獲得快照後,對索引處理 過程中版本發生更改,將會發生版本衝突。當快照的版本和索引版本一直時則進行更新,並且遞增文件版本號。
當遇到衝突而導致整個更新過程失敗時,更新過程是不會回滾的。如果不想因為衝突導致整個更新過程終止,可以在url中新增引數conflicts=proceed。或者在請求body中新增”conflicts”:”proceed”
效率測試
更新測試環境所有索引(14個),文件數量123649,耗時49616,效率2490個/s。觀察伺服器負載在2左右。
測試環境es為單個節點。
總體上對效能影響不大。
注意點
- 新增IK熱詞後,需要等熱詞生效後才能掉該介面。可以使用分詞分析介面來確認。
http://10.120.241.194:9200/indexname/_analyze?text=銀天下&tokenizer=ik_max_word
該介面返回有對應分詞即表示新增成功。