1

私は2つの文書を持っています:

{
    id: 7,
    title: 'Wet',
    description: 'asdfasdfasdf'
}

{
    id: 6
    title: 'Wet wet',
    description: 'asdfasdfasdf'
}

2 番目の文書の余分な単語を除いて、それらはほとんど同じです。

私のクエリはこれです:

var qobject = {
        query:{
            custom_score:{
                query:{
                   multi_match:{
                     query: q, //I searched for "wet"
                     fields: ['title','description'],
                   }
                },
                script: '_score '
            }
        }
    }

OK、このクエリを実行すると、次の結果が得られます。

{ total: 2,
  max_score: 1.8472979,
  hits: 
   [ { _index: 'products',
       _type: 'products',
       _id: '7',
       _score: 1.9808292,
       _source: [Object] },
     { _index: 'products',
       _type: 'products',
       _id: '6',
       _score:  1.7508222,
       _source: [Object] } ] }

ID 7 が ID 6 よりも上位にランクされるのはなぜですか? スコアの背後にある理由は何ですか? 2語あるから6の方が上じゃない?

より多くの単語 = より多くの重みが必要な場合はどうすればよいですか? それを変更するには、クエリをどうすればよいですか?

説明は以下です。

"_explanation": {
            "value": 1.9808292,
            "description": "custom score, product of:",
            "details": [
                {
                    "value": 1.9808292,
                    "description": "script score function: composed of:",
                    "details": [
                        {
                            "value": 1.9808292,
                            "description": "fieldWeight(title:wet in 0), product of:",
                            "details": [
                                {
                                    "value": 1,
                                    "description": "tf(termFreq(title:wet)=1)"
                                },
                                {
                                    "value": 1.9808292,
                                    "description": "idf(docFreq=2, maxDocs=8)"
                                },
                                {
                                    "value": 1,
                                    "description": "fieldNorm(field=title, doc=0)"
                                }
                            ]
                        }
                    ]
                },
                {
                    "value": 1,
                    "description": "queryBoost"
                }
            ]
        }

"_explanation": {
            "value": 1.7508222,
            "description": "custom score, product of:",
            "details": [
                {
                    "value": 1.7508222,
                    "description": "script score function: composed of:",
                    "details": [
                        {
                            "value": 1.7508222,
                            "description": "fieldWeight(title:wet in 0), product of:",
                            "details": [
                                {
                                    "value": 1.4142135,
                                    "description": "tf(termFreq(title:wet)=2)"
                                },
                                {
                                    "value": 1.9808292,
                                    "description": "idf(docFreq=2, maxDocs=8)"
                                },
                                {
                                    "value": 0.625,
                                    "description": "fieldNorm(field=title, doc=0)"
                                }
                            ]
                        }
                    ]
                },
                {
                    "value": 1,
                    "description": "queryBoost"
                }
            ]
        }
4

1 に答える 1

7

クエリの Explain 出力を見て、その理由を確認してください。Explain APIを使用するか"explain": true、現在の検索リクエストに追加することができます。

デフォルトでは、lucene は tf/idf (単語の頻度、反転したドキュメントの頻度) 類似度を使用してドキュメントをスコア付けします。クエリに一致する用語ごとに、さまざまな要因が考慮されます。最も重要なものは次のとおりです。

  • 用語の頻度: 用語がドキュメント内でどのくらいの頻度であるか。多ければ多いほどよい。用語が複数回出現する場合、ドキュメントはより適切に一致します。
  • 逆文書頻度: 用語がインデックス全体でどのくらいの頻度であるか。少ないほど良い。まれな用語は一般的な用語に勝ちます。
  • ノルム: インデックス時間ブースティング (デフォルト 1、ブーストなし) + フィールド ノルム。これは、短いフィールドが長いフィールドよりも優れていることを定義します。

実行しているクエリに基づいて、基準のためにドキュメントのスコアが異なります。マッピングでノルムを無効にする (およびインデックスを再作成する) ことができますが、そうすると、インデックス時間のブーストも失われます (とにかく使用しているとは思いません)。実際、あなたの例では、用語の頻度が高いにもかかわらず (1 ではなく 2)、フィールド ノルムが低いため、2 番目のドキュメントのスコアが低くなります。

Antoher の解決策は、異なる lucene の類似性をプラグインすることです。lucene 4 はより多くの類似性を提供し、フィールドごとの類似性を定義することもできます。これらの機能は、elasticsearch 0.90 で公開されています。

于 2013-03-29T08:06:52.853 に答える