5

Elasticsearch の非常に基本的なノウハウを超える問題を解決する必要があります。

オブジェクトのセットがあります - それぞれにタグのセットがあります。お気に入り:

obj_1 = ["a", "b", "c"]
obj_2 = ["a", "b"]
obj_3 = ["c", "b"]

加重タグを使用してオブジェクトを検索したい。例えば:

search_tags = {'a': 1.0, 'c': 1.5}

検索タグを OR クエリにしたい。つまり、クエリされたすべてのタグを持たないドキュメントを除外したくありません。しかし、私はそれらを最も重みのあるもので並べたいと思っています(並べ替え:一致した各タグにその重みを掛けたもの)。

上記の例を使用すると、返されるドキュメントの順序は次のようになります。

  • obj_1 (スコア: 1.0+1.5)
  • obj_3 (スコア: 1.5)
  • obj_2 (スコア: 1.0)

ドキュメントの構造と ES をクエリする正しい方法に関して、これに対する最善のアプローチは何でしょうか?

ここに同様の質問があります:エラスティック検索 - タグ付けの強度 (ネストされた/子ドキュメントのブースティング)のみ、インデックス作成時に重みを指定したくない - 検索時に実行したい.

私の現在の設定は次のとおりです。

オブジェクト:

[
   "title":"1", "tags" : ["a", "b", "c"],
   "title":"2", "tags" : ["a", "b"],
   "title":"3", "tags" : ["c", "b"],
   "title":"4", "tags" : ["b"]
]

そして私の質問:

{ 
    "query": {
        "custom_filters_score": {
            "query": { 
                "terms": {
                    "tags": ["a", "c"],
                    "minimum_match": 1
                }
            },
            "filters": [
                {"filter":{"term":{"tags":"a"}}, "boost":1.0},    
                {"filter":{"term":{"tags":"c"}}, "boost":1.5}    
            ],
            "score_mode": "total"
        }
    }
}

問題は、オブジェクト 1 と 3 のみを返すことです。オブジェクト 2 (タグ "a" を持つ) にも一致する必要がありますか、それとも何か間違っていますか?

提案どおりに更新

Ok。最小値を計算するスクリプトにブーストを変更しました。最小一致を削除しました。私の要求:

{
    "query": {
        "custom_filters_score": {
            "query": {
                "terms": {
                    "tags": ["a", "c"]
                }
            },
            "filters": [
                {"filter":{"term":{"tags":"a"}}, "script":"1.0"},
                {"filter":{"term":{"tags":"c"}}, "script":"1.5"}
            ],
            "score_mode": "total"
        }
    }
}

応答:

{
    "_shards": {
        "failed": 0,
        "successful": 5,
        "total": 5
    },
    "hits": {
        "hits": [
            {
                "_id": "3",
                "_index": "test",
                "_score": 0.23837921,
                "_source": {
                    "tags": [
                        "c",
                        "b"
                    ],
                    "title": "3"
                },
                "_type": "bit"
            },
            {
                "_id": "1",
                "_index": "test",
                "_score": 0.042195037,
                "_source": {
                    "tags": [
                        "a",
                        "b",
                        "c"
                    ],
                    "title": "1"
                },
                "_type": "bit"
            }
        ],
        "max_score": 0.23837921,
        "total": 2
    },
    "timed_out": false,
    "took": 3
}

まだ順序が間違っていて、1 つの結果がありません。obj_1 は obj_3 の前にある必要があり (両方のタグがあるため)、obj_2 はまだ完全に欠落しています。どうすればいいの?

4

1 に答える 1

1

私の例には2つの問題がありました。

  1. 「a」という用語はストップワードであるため、破棄され、「c」という用語のみが使用されていました。
  2. custom_filters_score クエリには「constant_score」クエリを含めて、ブースト前にすべての用語が同じ重みを持つようにする必要があります。

今それは動作します!

于 2013-09-07T16:22:41.990 に答える