2016-07-22 303 views
0

我有很多包含rate屬性的文檔,它是一個包含可接受比率的最小/最大範圍的數組。Elasticsearch:如何根據最大/最小值的數組得分範圍查詢

{ "rate": [250, 700] } 

我現在想執行提供了另一種範圍查詢,例如:

{ 
    "bool": { 
    "must": [ 
     "range": { 
     "rate": { "from": 100, "to": 500 } 
     } 
    ] 
    } 
} 

這工作正常,並始終返回在範圍內設置的值的至少一個值是什麼我想要。

但是,對於所有結果,分數是相同的。無論文檔中的值是否與文檔上的值相同,或者只是碰到了幾個數字的範圍都沒關係。如下圖所示:

{ 
    "_id": "one", 
    "_score": 1", 
    "_source": { "rate": [250,750] } 
}, 
{ 
    "_id": "two", 
    "_score": 1", 
    "_source": { "rate": [200,350] } 
}, 
{ 
    "_id": "three", 
    "_score": 1", 
    "_source": { "rate": [500,750] } 
} 

有什麼辦法可以改善範圍搜索提供另一個範圍嗎?

回答

0

您要求的是range,這是隱含的是或否的問題。實際上,除了作爲一種助推器之外,甚至還有可能超過其他任何東西都難以對付它(例如:如果有,那麼提高分數,但如果它沒有,那麼沒關係)。因此,range查詢趨向最好在過濾器上下文中使用。

"query": { 
    "bool": { 
    "filter": [ 
     { 
     "range": { 
      "rate": { "gte": 100, "lte": 500 } 
     } 
     } 
    ] 
    } 
} 

(語法假設ES 2.0)

這並不能真正幫助你,但它是更好的方式來做到這一點,你正在做的請求。

至於你在問什麼,你想根據文檔中的原始值進行加權。這是很多減去直接,因爲該值是一個數組,其值可能超出範圍,它不是一個nested對象,所以它總是被視爲一個數組(這意味着您需要手動重新排除忽略結果)。

完全自定義評分需要腳本(本地或其他),這可以通過腳本評分輕鬆完成。

如果該值與文檔上的值相同,或者只是碰到少量數字的範圍,則無關緊要。

我實際上並沒有明白第一部分的意思:你想讓單個比賽「重量」減少還是更多?距離邊緣的距離是否重要?只是匹配很重要?

我會認爲更多的比賽是更好的,無論在哪裏,他們的範圍不同的情況:

{ 
    "query": { 
    "bool": { 
     "must": { 
     "function_score": { 
      "functions": [ 
      { 
       "script_score": { 
       "script": { 
        "inline": "doc['rate'].values.findAll { it >= gte && it <= lte }.size()", 
        "lang": "groovy", 
        "params": { 
        "gte": 100, 
        "lte": 500 
        } 
       } 
       } 
      } 
      ], 
      "boost_mode": "replace" 
     } 
     }, 
     "filter": [ 
     { 
      "range": { 
      "rate": { 
       "gte": 100, 
       "lte": 500 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

你應該not be using inline Groovy scripts in production(根據使用的文件腳本代替),但上面會工作。

+0

謝謝,@pickypg,我實際上已經忘記了當我問這個問題(現在修復)時添加了範圍查詢。不幸的是,當我使用AWS ES服務時,我無法訪問groovy。你會想到其他任何可以使它工作的想法嗎?如果有幫助,我可以對數據進行不同的建模,但是我發現像'rate_from'和'rate_to'這樣的單獨值更加複雜。這個想法是,它與範圍內的某個區域匹配得越多,或者評分越高(即提供100,500個輸入時,100,500個輸入將是100%匹配,而400,700則不是那麼多。 – zanona