我有多個領域,例如。f1, f2, f3, 我想針對每個搜索一個術語并回傳任何欄位匹配的聚合分數。我不想用相同的詞搜索每個欄位,只用它自己的詞搜索一個欄位,例如。f1:t1, f2:t2, f3:t3.
最初,我使用的是mustbool 查詢,multi_match所有欄位都連接為t1 t2 t3所有欄位,并且搜索了所有欄位,但結果不是很好。使用dis_max查詢可以獲得更好的結果,我可以通過他們自己的術語搜索各個欄位,但如果例如t1在f1ANDt2的f2結果中找到,則dis_max回傳最高的結果分數。因此,如果我有 3 個帶有{ "f1": "foo", "f2": "foo" },的檔案{ "f1": "foo", "f2": "bar" },{ "f1": "foo", "f2": "baz" }并且我搜索f1:foo并且在最近創建它的情況下,我仍然可以用off2:ba取回第一條記錄。我想做的是說匹配,所以有一個與之相關的分數,并且匹配f2foof1foof2bar所以得到的分數應該f1.score f2.score總是把它帶到頂部,因為它匹配兩者。
我發現我可以以編程方式構建一個使用的查詢query_string,例如。(為簡潔起見,僅限于兩個欄位)
GET /_search
{
"query": {
"query_string": {
"query": "(f1:foo OR f1.autocomplete:foo) OR (f2:ba OR f2.autocomplete:ba)"
}
}
}
但我需要為這些欄位添加一個提升,這不允許這樣做。我也可以將 adis_max與一組 一起使用queries,但我真的不確定在這種情況下如何匯總分數。
使用更好的詞,我要搜索的是:如果我有人員資料并且我想搜索名字和姓氏,而不是按姓氏和姓氏搜索,則結果匹配名字和姓氏應該高于它只回傳一個或另一個。
有沒有更好/更好/正確的方法來使用某些東西來實作這一目標?我覺得我已經使用了很多查詢 API,但還沒有找到最好的東西。
uj5u.com熱心網友回復:
您可以使用簡單的應該查詢
minimum_should_match:1,
"should" : [
{ "term" : { "f1" : "foo" } },
{ "term" : { "f2" : "ba" } }
]
檔案匹配的子句越多,得分越高。
uj5u.com熱心網友回復:
無法編輯提供的答案,因此在此處發布從其他答案派生的解決方案。
GET _search
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"f1": {
"query": "foo",
"boost": 1.5
}
}
},
{
"match": {
"f1.autocomplete": {
"query": "foo",
"boost": 1.5
}
}
},
{
"match": {
"f2": {
"query": "ba",
"boost": 1
}
}
},
{
"match": {
"f2.autocomplete": {
"query": "ba",
"boost": 1
}
}
}
]
}
}
}
這讓我得到滿足我所有標準的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/513930.html
標籤:弹性搜索
