簡體   English   中英

Elasticsearch如何替換“術語”查詢?

[英]Elasticsearch how to replace “terms” query?

在版本6之前使用Elasticsearch,以下查詢基於與查詢的相似性返回匹配。 現在,在ES 6+中,這將根據它們是否匹配查詢的任何部分(均具有相同分數)返回匹配。 此更改中斷了其余更復雜的查詢(未顯示)。

對於以下查詢,我如何獲得與舊版ES 5匹配的命中分數

{
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "some_field_name": [
              "iPad Pro",
              "iPhone 8"
            ]
          }
        }
      ]
    }
  }
}

在ES 5中,匹配所有字詞的得分較高,而匹配較少的得分較低。 在ES 6+中,此結果僅返回得分= 1的匹配,因此它們的排名不考慮匹配項的數量。

例如,在ES 5中,同時具有兩個字詞的匹配項排名較高:

"_score": 0.87546873, when 2 of 4 terms match
"_score": 0.60353506, when 2 of 5 terms match
"_score": 0.13353139, when 1 of 4 terms match

這很像我們需要的理想“余弦”相似度(應該理解這並不是精確地創建分數)。

對於上述查詢,哪種查詢將返回與ES 5相同的分數。 換句話說,什么是ES 6等效查詢?

注意:由於評論中的討論越來越長且笨拙,因此僅將其作為建議草案發布。

更新:剛剛檢查了我建議的兩種方法,並且兩者似乎都給出了相似的評分。 請嘗試這些方法,看看您獲得的分數是否與您相關。

我知道它不適用於條款,但我建議將其替換為也具有boost參數的多個“ term”過濾器,或者將其替換為“ term_set”查詢,並將required_matches參數設置為“ 1”,因為我們希望“或”行為。

1)使用terms_set查詢:

{
  "query": {
    "bool": {
      "should": [
        {
          "terms_set": {
            "some_field_name": {
             "terms" : ["iPad Pro", "iPhone 8"],
             "minimum_should_match_script": {
                "source": "1"
              } 

            }
          }
        }
      ]
    }
  }
}

2)使用多個術語過濾器代替單個術語過濾器:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "some_field_name": "iPad Pro"
          }
        },
        {
          "term": {
            "some_field_name": "iPhone 8"
          }
        }
      ]
    }
  }
}

如果您使用術語提升,則應在每個術語塊中應用相同的提升。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM