2013-07-08 11 views
9

私が探しているのは、ElasticSearch(Lucene)のデフォルト採点メカニズムが実際にどのように機能しているかについての明確かつ明確な説明です。つまりLuceneスコアリングを使用するのでしょうか、それとも独自のスコアリングを使用するのでしょうか?ElasticSearchのデフォルトの採点メカニズム

たとえば、「名前」フィールドなどでドキュメントを検索したいとします。私は.NET NESTクライアントを使用してクエリを記述します。のは、このタイプの問合せを考えてみましょう:

なJSONクエリに変換され
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"))) 
); 

{ 
"from": 0, 
"size": 300, 
"explain": true, 
"query": { 
    "match": { 
    "Name": { 
     "query": "ExampleName" 
     } 
    } 
    } 
} 

検索がオンに行われる程度110万のドキュメントがあります。私は、見返りに取得すること(つまり、自分でフォーマットされた結果の一部だけ、である)である:

最初のフィールドはちょうど同上、第二は、名前ElasticSearchは、それが検索です行われているフィールド、および第三である
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 

スコアです。

ご覧のとおり、ESインデックスには重複が多数あります。発見された文書の中には異なるスコアがあるものの、それらがまったく同じであるにもかかわらず、異なるアイデアでは同じであるにもかかわらず、異なるデータセットの異なる部分を検索することで、全体的にスコアがいくぶんかとなる検索エンジンで実際に検討されている文書に限定されるわけではありません。

質問は、どのくらい正確にこのスコアリングが機能しますか? ESで見つかった各文書のスコアを計算するための正確な公式を教えてもらえますか?そして、最終的に、この採点メカニズムをどのように変更することができますか?

答えて

11

デフォルトスコアは、コアのLucene、largely documented hereでDefaultSimilarityアルゴリズムです。 your own Similarityを設定するか、custom_score queryのようなものを使用して得点をカスタマイズできます。

表示された最初の5つの結果の奇妙な差異は、質問結果とその順序の妥当性に関する限り、それほど気にならないほど小さいようですが、その原因を理解したい場合は、 explain apiは、そこに起こっていることを正確に示すことができます。

+0

OK、それは私が知りたいと思っていたことをかなりカバーしています。 ESが純粋にLuceneの類似性を使用しているという情報は非常に役に立ちます。ありがとう! –

+0

Luceneの得点アルゴリズムの要因に関する詳細:http://www.lucenetutorial.com/advanced-topics/scoring.html – ThoQ

2

スコアの変化は、特定のシャードのデータに基づいています(疑わしい)。デフォルトでは、ESはというクエリの検索タイプを使用してを取得し、各シャードにクエリを送信し、ローカルのTDIFを使用して一致するすべてのドキュメントを検索します(これは、特定のシャードのデータに基づいて異なります) 。

dfs query then fetch」の検索タイプを使用して変更することができます。各シャードは用語とドキュメントの頻度について質問し、各シャードなどにクエリを送信します。

あなたはElasticSearchドキュメントの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" 
     } 
    } 
    } 
}' 
関連する問題