2017-02-16 27 views
8

我有一些重複字段的數據。我不希望重複出現在搜索結果的頂部,但我不想完全消除它們。我只想獲得更好的品種,所以第二,第三,第n次出現相同的字段值將被降級。 ElasticSearch可能嗎?ElasticSearch中的處罰 - 但不是消除重複 -

例如:

curl -XPOST 'http://localhost:9200/employeeid/info/1' -d '{ 
"name": "John", 
"organisation": "Apple", 
"importance": 1000 
}' 

curl -XPOST 'http://localhost:9200/employeeid/info/2' -d '{ 
"name":"John", 
"organisation":"Apple", 
"importance": 2000 
}' 

curl -XPOST 'http://localhost:9200/employeeid/info/3' -d '{ 
"name": "Sam", 
"organisation": "Apple", 
"importance": 0 
}' 

(基於this

如果我們假設搜索由重要性提升,對於 「蘋果」 的搜索自然結果將是JohnJohnSam。我正在尋找的是一種方法,使結果John,Sam,John,即懲罰第二John因爲另一個John已經出現。

+0

的值相信可能解決方案是使用腳本和得分:https://www.elastic.co/ guide/en/elasticsearch/reference/current/modules-scripting-painless.html,https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-advan ced-scripting.html。 –

回答

3

您可以在索引時調整重要性字段,方法是查找所有重複項並選擇其中一個重複項「更重要」 - 也許選擇得分最高的重複項。從你的例子中,我將5000增加到現有的重要性值。

結果現在排名如下。

約翰/蘋果-7000,薩姆/蘋果-5000,約翰/蘋果1000

但是,這意味着你將需要重新索引,如果你決定將5000更改爲10000,調整的得分,因爲它取決於重要程度。

或者,您可以添加一個名爲「管理機構」的另一個領域,你可以給值1具有最高的重要性重複和使用評分功能來提供的查詢時間步驟: -

"script_score": { 
    "script": "(_score * 5000) + doc['importance'].value + (doc['authority'].value * 5000)" 
} 

注意,對於_score乘法器取決於原始排名算法上,該承擔_score從0.0到1.0

+1

_score綁定在0和1之間,你認爲它在你的計算中與'權限'字段有關嗎? – Adonis

+0

謝謝。好點 - 我可以調整並添加關於_score的備註,因爲它取決於原始評分算法。 – abdollar

+0

謝謝。我希望將來有更直接的方式,但是像這樣一些額外的索引工作可以做到。 – mahemoff