私はElasticSearchを初めて利用しています。これまで私はDjango-Haystackのみを非常に限られた方法で使用してきましたが、ESに直接話をしたことはありません。弾性検索順序の用語集スコア
現在、ElasticSearch(この場合は5.x)のインデックスといくつかのドキュメントがあります。私はPython + elasticsearch-dsl + django-elasticsearch-dslを使用していますので、データベースモデルのインデックスを作成していますが、それは問題ではありません。私はこの質問を図書館にとらわれないままにしようとします。
概念的には、ユーザーとその投稿をすべて同じインデックスに保存しています。ユーザ用と投稿用のドキュメントには共通のものが1つあります。フィールドはuser_id
です。
ユーザーは次のようになります。
{
"_id": 1,
"_type": "user_document",
"username": "jdoe",
"user_id": 1,
"title": "Test user"
}
そしてポストは、このようなものです:
{
"_id": 1,
"_doc": "post_document",
"user_id": 1,
"title": "Hello world!",
"text": "Lorem ipsum test test test..."
}
私は実装するために私のアプリがオーバーフルテキスト検索を行い、シングル入力検索フィールドで欲しいですユーザーとその投稿の両方(現実世界にはもっと多くのドキュメントタイプがあります - ここでは単純に例を挙げています)。 user_id
を集計して、一致した別個のユーザーのリストを表示したいと思います。
現在、私はこのようなクエリをやってる:
{
"query": {
"multi_match": {
"query": "test",
"fields": ["username^3", "title^2", "text"]
}
},
"aggs": {
"user_ids": {"terms": {"field": "user_id"}}
}
}
次に一致するユーザーのリストを取得するために、応答のaggregations.user_ids.buckets.key
を使用します。
しかし、そのリストはドキュメント数によって単純に並べられているようです(つまり、ユーザーが "test"という単語を含む投稿を持っている場合、 "test"という名前のユーザーに勝つようです)。注文する。私の現在のアイデアは、平均(または中央値)の文書一致_score
を使用することです。
注:実際の状況では、2つ以上のドキュメントタイプが存在するため、特定の_type
のショートカットを使用してクエリを実行することはできません。
どうすればいいですか?私は"Sorting by a Metric"の章を読んでいますが、そこにあるアイデアは私にはいくらか失われています。私はいくつかの試みを行いましたが、基本的にナンセンスでした。誰も具体的なクエリの例を表示してください(非常に好ましくは、それがどのように構築されたかを説明してください)ので、私はそれから学ぶことができますか?
ここにはGist with an example datasetと、上記の検索クエリと、私が得た正確な結果があります。私は(test_query_01_results.json
に)したいことは、私は私が間違ってやってる感じもう一つは、そのIドン」です2.0794415>(0.78306973 + 0.45315093)/ 2.
というロジックで、2の上にuser_id
1を優先されていることですhits
を使用してください - 私はそれらを必要としません - 集計されたuser_id
値のみ。これが問題ないのであれば、それらを「無効にする」方法があり、集計だけを返しますか?
感謝。これは私の時間を節約します。 – Arafath