1. 程式人生 > >ElasticSearch教程——relevance score

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生產環境下,不推薦這個引數,因為效能很差。