ElasticSearch教程——relevance score
ElasticSearch彙總請檢視:ElasticSearch教程——彙總篇
relevance score (相關性分數)
需求:搜尋標題中包含java的帖子,同時呢,如果標題中包含hadoop或elasticsearch就優先搜尋出來,同時呢,如果一個帖子包含java hadoop,一個帖子包含java elasticsearch,包含hadoop的帖子要比elasticsearch優先搜尋出來
知識點,搜尋條件的權重,boost,可以將某個搜尋條件的權重加大,此時當匹配這個搜尋條件和匹配另一個搜尋條件的document,計算relevance score時,匹配權重更大的搜尋條件的document,relevance score會更高,當然也就會優先被返回回來
預設情況下,搜尋條件的權重都是一樣的,都是1
GET /forum/article/_search { "query": { "bool": { "must": [ { "match": { "title": "blog" } } ], "should": [ { "match": { "title": { "query": "java" } } }, { "match": { "title": { "query": "hadoop" } } }, { "match": { "title": { "query": "elasticsearch" } } }, { "match": { "title": { "query": "spark", "boost": 5 } } } ] } } }
多shard場景下relevance score不準確問題大揭祕
1、如果你的一個index有多個shard的話,可能搜尋結果會不準確
2、如何解決該問題?
(1)生產環境下,資料量大,儘可能實現均勻分配
資料量很大的話,其實一般情況下,在概率學的背景下,es都是在多個shard中均勻路由資料的,路由的時候根據_id,負載均衡
比如說有10個document,title都包含java,一共有5個shard,那麼在概率學的背景下,如果負載均衡的話,其實每個shard都應該有2個doc,title包含java
如果說資料分佈均勻的話,其實就沒有剛才說的那個問題了
(2)測試環境下,將索引的primary shard設定為1個,number_of_shards=1,index settings
如果說只有一個shard,那麼當然,所有的document都在這個shard裡面,就沒有這個問題了
(3)測試環境下,搜尋附帶search_type=dfs_query_then_fetch引數,會將local IDF取出來計算global IDF
計算一個doc的相關度分數的時候,就會將所有shard對的local IDF計算一下,獲取出來,在本地進行global IDF分數的計算,會將所有shard的doc作為上下文來進行計算,也能確保準確性。但是production生產環境下,不推薦這個引數,因為效能很差。