ElasticSearchにクエリを実行して、さまざまなファセットの上位の結果を返す方法があるかどうか知りたいです。たとえば、ツイートを書いているユーザーがいるとしましょう。
user: kimchy
user_eye_color: blue
tweet: elasticsearch training early bird discounts
# Lots of other message from blue eye color users mentioning 'bird'
user: lord_oliver
user_eye_color: amber-green
tweet: vanquished and consumed the twitter bird. today is a good day.
「鳥」に言及するツイートを書く十分なblue
目のユーザー(またはより一般的な他の色amber-green
)がいる場合、「鳥」を検索しても、オリバー卿のツイートのスコアがかなり高い場合でも、オリバー卿のツイートが表示されることはありません。
[この架空の例では]多様なユーザーからの結果を表示したいので、これは問題です。現在の解決策の1つは、目の色にファセットを追加することです。
facets:
eye_color:
terms: {"field": "user_eye_color"}
その後、複数のフィルタリングされた検索を実行します。ただし、これはかなり非効率的なようです。
質問:ElasticSearchには、さまざまなファセット(この場合はuser_eye_color=amber-green
)から上位の結果を返す、ステートフルなカスタムスコアリング関数を作成する、またはその他のクリエイティブなソリューションを使用して、複数の結果セットを返す方法はありますか?
私がこれをやりたい理由は、すべての検索結果に全順序(浮動小数点スコア)を付けることが難しい場合があるということです。すべてのamber-green
目の色のユーザーがたまたま猫であり、さまざまな種類のドキュメント(ツイート)を書いているとします。すべての猫が書いたドキュメントをすべてのドキュメントと完全な順序に強制しようとするのではなく、パレート最適なドキュメント(X
-eye-colorカテゴリ内で最適なドキュメント)が必要です。次に、より賢明なポストフィルタリングを実行できます。たとえば、猫が書いたドキュメントを適切なものがない場合は削除したり、何らかの賢明な結果のインターリーブを実行したりできます。[目の色に基づく]ある種のスコア乗数をドロップすると、効果が低下する可能性があります。
私のおもちゃの例(またはその手に負えない風刺)が気に入らない場合は、ツイートやFBIレポートなど、さまざまなドキュメントタイプのインデックスがある場合を考えてみてください...