2017-02-16 33 views
8

重複したフィールドを持つデータがあります。検索結果の上に重複が一緒に表示されることは望ましくありませんが、それらを完全に排除したくありません。私はちょうど良いバラエティーを得たいので、同じフィールド値の2番目、3番目... n番目の出現は降格されるでしょう。 ElasticSearchで可能ですか?例えばElasticSearchで重複を排除していますが、重複を排除していません。

:(thisに基づく)

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 
}' 

我々は検索が重要で昇圧されたと仮定した場合、 "アップル" の検索のための自然な結果がJohnJohnSamだろう。私が探しているのは、JohnSamJohnの結果を作る方法です。すなわち、別のJohnがすでに出現しているので、第2のJohnにペナルティを科します。

+0

に_scoreの値を前提としています: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を変更することを決めた場合は、インデックスを再する必要があります意味重要度の大きさに依存する。

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

また、あなたが最も重要との重複のために1の値を与えると、クエリ時にステップを提供するために、スコアリング関数を使用することができたため「権威」と呼ばれる別のフィールドを追加することができます

_scoreの乗数は、元のランキングアルゴリズムに依存し、これは私が可能な解決策は、スクリプトを使用して得点されると信じて0.0から1.0

+1

_scoreは0と1の間にバインドされていますが、あなたの計算では 'authority'フィールドとの関連性があると思いますか?ありがとう。 – Adonis

+0

ありがとう。良い点 - 元の得点アルゴリズムに依存するので、_scoreに関するメモを調整して追加することができます。 – abdollar

+0

ありがとうございます。私は将来的にもっと直接的な方法があることを願っていますが、このような追加の索引作成作業が可能です。 – mahemoff

関連する問題