14

私が探しているのは、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 によって検出された各ドキュメントのスコアを計算するための正確な式を教えて/見せて/教えてもらえますか? そして最終的に、このスコアリング メカニズムはどのように変更できるのでしょうか?

4

3 に答える 3

3

スコアの変動は、特定のシャードのデータに基づいています (ご想像のとおり)。デフォルトでは、ES は ' query then fetch ' と呼ばれる検索タイプを使用し、クエリを各シャードに送信し、ローカル TDIF を使用してスコアに一致するすべてのドキュメントを検索します (これは、特定のシャードのデータに基づいて異なります - ここに問題があります)。

これは、' dfs query then fetch ' 検索タイプを使用して変更できます。用語とドキュメントの頻度を尋ねる各シャードを事前にクエリしてから、各シャードにクエリを送信します。

URLで設定できます

$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '{
  "from": 0,
  "size": 300,
  "explain": true,
  "query": {
    "match": {
      "Name": {
        "query": "ExampleName"
      }
    }
  }
}' 
于 2015-02-10T19:32:47.103 に答える
1

エラスティックサーチのドキュメントでの優れた説明:

于 2015-08-28T12:14:58.910 に答える