66

フィールドの特定の値に基づいてドキュメントの関連性を高める方法をElasticSearchで見つける必要があります。具体的には、すべてのドキュメントに特別なフィールドがあり、フィールド値が高いほど、検索に関係なく、フィールド値を含むドキュメントの関連性が高くなります。

次のドキュメント構造を検討してください。

{
    "_all" : {"enabled" : "true"},
    "properties" : {
        "_id":            {"type" : "string",  "store" : "yes", "index" : "not_analyzed"},
        "first_name":     {"type" : "string",  "store" : "yes", "index" : "yes"},
        "last_name":      {"type" : "string",  "store" : "yes", "index" : "yes"},
        "boosting_field": {"type" : "integer", "store" : "yes", "index" : "yes"}
        }
}

boosting_fieldの値が高いドキュメントは、boosting_fieldの値が低いドキュメントよりも本質的に関連性が高いようにしたいと思います。これは単なる出発点です。クエリと他のフィールドとの一致も、検索の各ドキュメントの最終的な関連性スコアを決定する際に考慮されます。ただし、他のすべてが等しい場合、ブースティングフィールドが高いほど、ドキュメントの関連性が高くなります

誰かがこれを行う方法についてのアイデアを持っていますか?

どうもありがとう!

4

4 に答える 4

72

インデックス時またはクエリ時のいずれかでブーストできます。クエリが少し遅くなりますが、通常はクエリ時間のブーストを好みます。そうしないと、ブースティング係数を変更するたびにインデックスを再作成する必要があり、通常は微調整が必​​要で、かなり柔軟にする必要があります。

Elasticsearch クエリ DSL を使用してクエリ時間ブーストを適用するには、さまざまな方法があります。

最初の 3 つのクエリは、特定のクエリまたはフィルターに一致するドキュメントに特定のブーストを与えたい場合に役立ちます。たとえば、先月公開されたドキュメントのみをブーストしたい場合です。このアプローチを boosting_field で使用できますが、いくつかの boosting_field 間隔を手動で定義し、それらに別のブーストを与える必要がありますが、これはそれほど素晴らしいことではありません。

最善の解決策は、カスタム スコア クエリを使用することです。これにより、スクリプトを使用してクエリを作成し、そのスコアをカスタマイズできます。これは非常に強力で、スクリプトを使用してスコア自体を直接変更できます。まず、boosting_field の値をたとえば 0 から 1 の値にスケーリングして、最終的なスコアが大きな数値にならないようにします。そのためには、フィールドに含めることができる最小値と最大値の多かれ少なかれを予測する必要があります。たとえば、最小 0 と最大 100000 としましょう。boosting_field の値を 0 から 1 の間の数値にスケーリングすると、次のように結果を実際のスコアに追加できます。

{
    "query" : {
        "custom_score" : {
            "query" : {
                "match_all" : {}
            },
            "script" : "_score + (1 * doc.boosting_field.doubleValue / 100000)"
        }
    }
}

_score *boosting_field を (ではなく)ブースト ファクターとして使用することも検討できますが_score +、最小値 1 の間隔にスケーリングする必要があります (+1 を追加するだけです)。

スコアに影響を与えるために使用する値に重みを追加して重要度を変更するために、結果を調整することもできます。複数のブースティング ファクターを組み合わせて異なる重みを付ける必要がある場合は、これがさらに必要になります。

于 2012-09-14T19:17:07.500 に答える
3

クエリ内で毎回ブースティングを行うのを避けたい場合は、"boost: factor.

したがって、マッピングは次のようになります。

{
    "_all" : {"enabled" : "true"},
    "properties" : {
        "_id":            {"type" : "string",  "store" : "yes", "index" : "not_analyzed"},
        "first_name":     {"type" : "string",  "store" : "yes", "index" : "yes"},
        "last_name":      {"type" : "string",  "store" : "yes", "index" : "yes"},
        "boosting_field": {"type" : "integer", "store" : "yes", "index" : "yes", "boost" : 10.0,}
        }
}
于 2014-01-26T17:23:37.670 に答える