2013-07-08 15 views
9

Was ich suche, ist klar, klare Erklärung, wie Standard-Scoring-Mechanismus von ElasticSearch (Lucene) wirklich funktioniert. Ich meine, verwendet es Lucene Scoring, oder nutzt es vielleicht eigene Scoring?ElasticSearch Standard-Scoring-Mechanismus

Zum Beispiel möchte ich nach Dokumenten suchen, zum Beispiel nach "Name" -Feld. Ich benutze .NET NEST Client, um meine Abfragen zu schreiben. Lassen Sie uns diese Art der Abfrage betrachten:

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"))) 
); 

, die zu solchen JSON Abfrage übersetzt:

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

Es rund 1,1 Millionen Dokumente, die Suche auf durchgeführt wird. Was ich dafür zu bekommen, ist (dass nur ein Teil des Ergebnisses ist, formatiert auf meinem eigenen):

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 

wo erste Feld nur eine ID, die zweite ist Namensfeld, auf dem Elasticsearch ausgeführt es die Suche und dritten ist Punktzahl.

Wie Sie sehen können, gibt es viele Duplikate im ES-Index. Da einige der gefundenen Dokumente unterschiedliche Werte haben, obwohl sie genau die gleichen sind (mit nur unterschiedlicher ID), kam ich zu dem Schluss, dass verschiedene Shards die Suche nach verschiedenen Teilen des gesamten Datasets durchführen Daten in gegebener Shard, nicht ausschließlich auf Dokument, das tatsächlich von der Suchmaschine berücksichtigt wird.

Die Frage ist, wie funktioniert das Scoring genau? Ich meine, könnten Sie mir sagen/zeigen Sie mir/genaue Formel, um die Punktzahl für jedes von ES gefundene Dokument zu berechnen? Und schließlich, wie kann dieser Bewertungsmechanismus geändert werden?

Antwort

11

Die Standardbewertung ist der DefaultSimilarity-Algorithmus im Kern Lucene, largely documented here. Sie können das Scoring anpassen, indem Sie your own Similarity konfigurieren oder etwas wie custom_score query verwenden.

Die ungerade Punktzahl Variation in den ersten fünf Ergebnissen scheint klein genug, dass es mich nicht viel angeht, was die Gültigkeit der Abfrage Ergebnisse und ihre Reihenfolge betrifft, aber wenn Sie die Ursache davon verstehen wollen, Die explain api kann Ihnen genau zeigen, was dort vor sich geht.

+0

OK, das deckt ziemlich genau das ab, was ich wissen wollte. Die Information, dass ES ausschließlich Lucenes Ähnlichkeit verwendet, ist sehr hilfreich. Vielen Dank! –

+0

Weitere Einzelheiten zu Faktoren in Lucenes Bewertungsalgorithmus: http://www.lucenetutorial.com/advanced-topics/scoring.html – ThoQ

2

Die Score-Variation basiert auf den Daten in einem bestimmten Shard (wie Sie vermutet haben). Standardmäßig verwendet ES einen Suchtyp mit dem Namen 'Abfrage, dann holen Sie', die die Abfrage an jeden Shard sendet, findet alle übereinstimmenden Dokumente mit Punkten unter Verwendung lokaler TDIFs (dies hängt von den Daten eines gegebenen Shards ab - hier ist Ihr Problem) .

Sie können dies ändern mit 'DFS-Abfrage dann holen' Suchtyp - Prequery jedes Shard nach Begriff und Dokument Häufigkeiten fragen und sendet dann eine Abfrage an jeden Shard etc ..

Sie können es in der URL gesetzt

$ 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" 
     } 
    } 
    } 
}'