[英]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.