1. 程式人生 > >ElasticSearch新增IK擴充套件詞後,讓歷史資料生效方法

ElasticSearch新增IK擴充套件詞後,讓歷史資料生效方法

問題描述

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為單個節點。

總體上對效能影響不大。

注意點

  1. 新增IK熱詞後,需要等熱詞生效後才能掉該介面。可以使用分詞分析介面來確認。
    http://10.120.241.194:9200/indexname/_analyze?text=銀天下&tokenizer=ik_max_word
    該介面返回有對應分詞即表示新增成功。