web-dev-qa-db-ja.com

ElasticSearch-フィールド値に基づいて関連性を高める

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

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

どうもありがとう!

62
Clay Wardell

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

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

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

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

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

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

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

69
javanna

Elasticsearchの最新バージョン(バージョン1.3以降)では、「関数スコアクエリ」を使用する必要があります。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

スコア付きのquery_string検索は次のようになります。

{
 'query': {
        'function_score': {
            'query': { 'query_string': { 'query': 'my search terms' } },
            'functions': [{ 'field_value_factor': { 'field': 'my_boost' } }]
        }
    }
}

「my_boost」は、検索インデックス内の数値フィールドで、個々のドキュメントのブースト係数が含まれています。次のようになります。

{ "my_boost": { "type": "float", "index": "not_analyzed" } }
13

クエリ内で毎回ブーストを行わないようにする場合は、マッピングに直接「ブースト:ファクター」を追加して追加することを検討してください。

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

{
    "_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,}
        }
}
3
HolgT