私が探しているのは、ElasticSearch (Lucene) のデフォルトのスコアリング メカニズムが実際にどのように機能するかについて、わかりやすく明確な説明です。つまり、Lucene スコアリングを使用するのでしょうか、それとも独自のスコアリングを使用するのでしょうか?
たとえば、「名前」フィールドなどでドキュメントを検索したい。.NET NEST クライアントを使用してクエリを記述しています。このタイプのクエリを考えてみましょう:
IQueryResponse<SomeEntity> queryResult = client.Search<SomeEntity>(s =>
s.From(0)
.Size(300)
.Explain()
.Query(q => q.Match(a => a.OnField(q.Resolve(f => f.Name)).QueryString("ExampleName")))
);
これは、次のような JSON クエリに変換されます。
{
"from": 0,
"size": 300,
"explain": true,
"query": {
"match": {
"Name": {
"query": "ExampleName"
}
}
}
}
検索が実行されるドキュメントは約 110 万件あります。見返りとして得られるものは次のとおりです(これは結果の一部にすぎず、独自にフォーマットされています):
650 "ExampleName" 7,313398
651 "ExampleName" 7,313398
652 "ExampleName" 7,313398
653 "ExampleName" 7,239194
654 "ExampleName" 7,239194
860 "ExampleName of Something" 4,5708737
ここで、最初のフィールドは単なる ID、2 番目は ElasticSearch が検索を実行した名前フィールド、3 番目はスコアです。
ご覧のとおり、ES インデックスには多くの重複があります。見つかったドキュメントのいくつかはスコアが異なりますが、それらはまったく同じ (異なる ID のみ) であるにもかかわらず、異なるシャードがデータセット全体の異なる部分で検索を実行したと結論付けました。検索エンジンによって実際に考慮されるドキュメントだけでなく、特定のシャード内のデータ。
問題は、このスコアリングがどのように機能するかです。つまり、ES によって検出された各ドキュメントのスコアを計算するための正確な式を教えて/見せて/教えてもらえますか? そして最終的に、このスコアリング メカニズムはどのように変更できるのでしょうか?