score在ES中有着很重要的做用,有了它纔有了rank,是驗證文檔相關性的關鍵數據,score越大表明匹配到的文檔相關性越大html
查詢的時候能夠用explain來展現score的計算過程,也能夠增長format=yaml來說json轉成yaml方便閱讀java
相似xxx/_search?explain&format=yamlnode
下圖是經過explain看到的一部分json,其實這個解釋中就展現出了計算公式,不得不說ES在這點上仍是很人性化的算法
常說的相關性是指計算一個全文(full-text)字段的內容與全文查詢字符串的類似程度的算法。apache
這個算法默認是BM25,一個基於TF-IDF(term frequency/inverse document frequency)的算法。json
首先是TF(term frequency),顧名思義,term在field出現的頻率越高,則該term與field的相關性越高。socket
公式:elasticsearch
sqrt(TF)ide
而後是IDF(inverse document frequency),term在整個index出現的頻率越高,則該term與該document的相關性越低。fetch
公式:
Log(numDocs / docFreq + 1) + 1
BM全稱(Best Match),這個名稱不得不說有點過度,這個算法也一樣有TF和IDF。
TF,BM25把TF的影響範圍減少了,不像TF-IDF同樣沒有邊界
公式:
(k+1)* tf /(k + tf),k通常是個常量,[1.2,2],經過k能夠改變回歸的速度。
IDF幾乎同樣,只是多加了1(爲了提升其總體影響比重)
BM25新加了另外一個特徵,Field-length norm,field的長度有多少,若是field的長度越長,則該term與field的相關性越低(分母越大,機率越小)。
公式:
|d|/avgDl(本文檔的長度除以平均文檔的長度)
下圖爲不一樣文檔長度對應相同tf所影響最終tf的曲線。
公式:
(k + 1)* tf / k * ( 1.0 - b + b - L + tf) (其中b爲常數)
BM25 Field-length norm之間的對比
在TF角度的對比
Score的計算過程依賴query clause(查詢子條件),例如:
1.模糊查詢計算匹配到的word和原來的word(匹配前的word)的類似度
2.term查詢會包含找到該term所佔的百分比
個別查詢會結合TF-IDF的socre和其它因素,越多的query clause(查詢子條件)匹配到,那麼score就越高,具體來講,是query clause匹配獲得的score聯合起來計算出最終的score。
須要注意的是,TF-IDF默認是基於shard來計算的,假設1個index有5個shards,則就有5個TF-IDF的結果,也就是5個score,而後score再匯聚到request node,作排序後獲得最終結果。因此這有產生了另外一個問題,當index的documents數量較少時,score的結果會不許確,畢竟不是全局的,shard也只是經過hash來區分,有很大的隨機性和偶然性。針對這種狀況,ES給出了DFS Query Then Fetch(默認是採用Query Then Fetch)這種解決方案,採用全局計算TF-IDF的方式,解決這個問題,在查詢的時候能夠這麼設置
search_type=dfs_query_then_fetch
(不過會影響效率,畢竟是全局計算,多了幾回socket傳輸)。其實還有一種解決方法,直接把index的shard設置成1,這樣本身就表明了全局。
稍微解釋一下Query Then Fetch,顧名思義,是先查詢後獲取。
查詢流程以下
剛接觸score的時候,總有疑惑,爲何不是一個百分比,這樣可能更加直觀的表現出匹配到正確的機率,也就是術語」normalized socre」。
這麼想是錯誤的!
Score的意義僅僅在於對比一次查詢的多個結果的對比,起到rank做用,並不能表明匹配到的機率,更不能拿幾個匹配到的機率作比較,好比:當一個document自己沒有發生變化,可是index發生變化,就會影響匹配到document的sorce。這樣的機率是沒什麼意義的,雖然你能夠強行造出一個機率。
在作業務的過程當中領悟到,搜索系統和推薦系統不是一個系統(以前沒想過這個問題),重要區別之一就是主動和被動,詳細看這篇博客吧,說的很詳細了
http://blog.csdn.net/cserchen/article/details/50422553
//官方對相關性的解釋,也就是score的計算標準
https://www.elastic.co/guide/en/elasticsearch/guide/master/relevance-intro.html
//當你的數據不多時,請用DFS Query Then Fetch搜索方法
https://www.elastic.co/blog/understanding-query-then-fetch-vs-dfs-query-then-fetch
//ES的兩個搜索方法
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-type.html
//ES官方解釋的BM25和TF-IDF區別
https://www.elastic.co/blog/found-similarity-in-elasticsearch
//外國友人對BM25和TF-IDF的解讀
http://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/
//外國友人吐槽 當score變成percentage的後果