Elasticsearch 常用字效能調整

March 22, 2025

在 Elasticsearch 內,如果有每個文件都會 (或常常) 出現的字詞,例如英文文章的「is, the, not」,中文新聞文章的「相關、報導、可能」,可將這些字稱為「常用字」或「高頻字」。通常會將這些字詞加入停用字字典,避免效能降低。

處理方式

由於出現頻率很高,當查詢到常用字時,會造成有很多文件需要計算相關性,耗費大量計算資源,而造成效能的下降。因此有幾種處理方式:

  1. 加入停用字 (stopword) 字典:Elasticsearch 本身提供停用字字典,也可以針對不同語言設定,Analyzer 也可能提供停用字的機制 (ex. IK Analyzer)。但是在查詢時,就不會納入計分。
  2. 送關鍵字到 Elasticsearch 前,先減少不需要的常用字。
  3. 查詢時加入 minimum_should_match  參數:在 Query DSL 內設定此參數,要求須匹配一定比例或個數的字詞,才納入結果。因為減少了計算數量,可以折衷的解決效能問題。

Minimum_should_match 參數說明

那麼,讓我們來看一下怎麼使用 minimum_should_match 參數,以下是一個該參數的範例:

      "query": {
        "multi_match": {
          "query": "To be or not to be",
          "minimum_should_match": "75%",
          "fields": [ "article" ]
        }
      }

可以輸入百分比或詞語個數。輸入個數時,表示有幾個詞語是可以忽略 (負數則表示必須匹配)。輸入百分比時,表示有多少比例的詞語是必須匹配 (負百分比表示可被忽略的比例)。此外,也可以組合百分比和個數,請參考官方的參數選項說明。

如果需要使用在多個欄位上,請參考 Query string query - Elasticsearch Guide [8.16] - Elastic 的說明。

參考資料

附註