2013-07-08 30 views
9

我在尋找的是ElasticSearch(Lucene)默認評分機制如何真正起作用的簡單明瞭的解釋。我的意思是,它是使用Lucene得分還是使用自己的得分?ElasticSearch默認評分機制

例如,我想通過例如「名稱」字段來搜索文檔。我使用.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" 
     } 
    } 
    } 
} 

有是執行搜索約1.1萬份文件。我得到的回報,是(這僅僅是結果的一部分,格式化我自己):

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,第二個是上ElasticSearch執行它的搜索名稱字段,而第三是得分。

如您所見,ES索引中有許多重複項。由於一些發現的文檔具有不同的得分,儘管它們完全相同(僅具有不同的Id),但我得出結論:不同的碎片在整個數據集的不同部分上執行搜索,這導致我記錄得分基於總體給定分片中的數據,而不僅僅是搜索引擎實際考慮的文檔。

問題是,這個得分究竟如何工作?我的意思是,你能告訴我/告訴我/指向我的確切公式來計算ES找到的每個文檔的得分嗎?最終,這種評分機制如何改變?

回答

11

默認評分是內核Lucene中的DefaultSimilarity算法,largely documented here。您可以通過配置your own Similarity或使用類似custom_score query的內容來自定義評分。

顯示的前五個結果中的奇數分數變化似乎足夠小,以至於它對查詢結果及其排序的有效性沒有多大關注,但如果您想了解其原因, explain api可以告訴你到底發生了什麼。

+0

好的,這幾乎涵蓋了我想知道的。 ES純粹使用Lucene的相似性的信息非常有用。謝謝! –

+0

有關Lucene評分算法中因素的更多細節:http://www.lucenetutorial.com/advanced-topics/scoring.html – ThoQ

2

得分變化是基於給定碎片中的數據(就像您懷疑的那樣)。默認情況下,ES使用搜索類型'查詢然後提取',它將查詢發送到每個分片,使用本地TDIF查找所有匹配文檔與分數(這將根據給定分片上的數據而變化 - 這是您的問題) 。

您可以通過使用「DFS查詢,然後取」搜索類型改變這一點 - prequery每個碎片問項和文件的頻率,然後將查詢發送到每個碎片等。

您可以設置它在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" 
     } 
    } 
    } 
}'