2016-01-13 52 views
1

我在Elasticsearch中存儲了一個號碼views。我想以對數形式查找「最接近」的文檔,以便10k和1MM與100k個視圖的距離相同(並且得分相同)。那可能嗎?Elasticsearch可以在一個值的日誌上進行衰減搜索嗎?

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#exp-decay描述了field value factordecay functions,但他們可以「堆疊」?還有另一種方法嗎?

回答

1

我不確定您是否可以直接通過衰減來實現此目的,但您可以使用script_score函數輕鬆完成此操作。下面的示例使用動態腳本,但請注意使用file-based scripts是推薦的,更安全的方法。

在下面的查詢中,offset參數設置爲100,000,並且具有用於其「視圖」字段的值的文檔將得分最高。當視圖的價值從offset出發時,分數以對數形式衰減。根據您的示例,具有1,000,000和/或10,000的文檔具有相同的分數(此公式中爲0.30279312)。

您可以通過更改腳本的開始以將其乘以_score而不是除法來顛倒這些結果的順序。

$ curl -XPOST localhost:9200/somestuff/_search -d '{ 
    "size": 100, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "function_score": { 
      "functions": [ 
       { 
       "script_score": { 
        "params": { 
        "offset": 100000 
        }, 
        "script": "_score/(1 + ((log(offset) - log(doc['views'].value)).abs()))" 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
}' 

注意:根據您的數據,您可能需要考慮'views'爲null的可能性。

相關問題