2015-06-14 128 views
1

我剛開始探索elasticsearch。我需要找到在現場級別指定自定義分數的方法。例如:Elasticsearch:文本搜索中的字段級自定義分數

我有一個集合命名的博客,其文件都採用以下格式:

{ 
    "_id": "1736hst26672829", 
    "name": "Learning regular expressions basics", 
    "author": "John Lee", 
    "summery": "Here is summery.", 
    "body": "Content of the blog." 
} 

如果我搜索的集合文本「XYZ」,那麼結果應該反映以下得分標準

  • 匹配的字段中的「名稱」優先級爲1.
  • 匹配的作者字段具有第二優先級。
  • 在夏季比賽有第三優先。
  • 在體內匹配具有最低優先權。

我需要根據上述標準排名前10的結果。

+0

能否請你分享的方法你在這裏? – oblivion

回答

2

得分在ElasticSearch是非常定製,以下適用於基於查詢的時間定製得分。根據索引,在映射中(並因此應用於每個查詢),篩選器或方面,使用提升或自定義評分還有其他各種評分選項。

雖然自定義分數查詢通常是最強大的解決方案,但以下是各種自定義得分方法的文檔。

以下是可能在查詢時間將自定義得分的最簡單的方法,但我建議你在自定義分數查詢閱讀起來。

"query": { 
     "filtered": { 
      "query": 
       "bool": { 
        "must": [ 
        {"multi_match": { 
           "fields": [ 
            "name^4", 
            "author^3", 
            "summery^2", 
            "body^1" 
           ], 
           "query": "xyz", 
           "operator": "AND", 
           "type": "cross_fields", 
           "analyzer": "standard" 
         }} 
        ] 
       } 
      } 
     } 
    } 

對於搜索此答案但希望使用NEST的人,bellow與使用NEST的查詢是相同的。使用^字符來增強特定字段或使用OnFieldsWithBoost爲字段提供自定義評分,並且查詢按照分數排序。

var query = "xyz"; 

//Add your field names to a string in lower camelCase as is ES default. 
List<string> searchIn = new List<string(new string[] {"_id","name","author","summery","body"}); 

.Type("blogType") 
.SortDescending("_score") 
.Query(
    q => q.MultiMatch(
     t => t.OnFields(
      searchIn 
      .Select(qs => qs == "name" ? "name^4" : qs) 
      .Select(qs => qs == "author" ? "author^3" : qs) 
      .Select(qs => qs == "summery" ? "summery^2" : qs) 
      .Select(qs => qs == "body" ? "body" : qs) 
      ) 
     .Query(query) 
    ) 
) 

如果在ES正確的(默認)映射(C#對象ES索引JSON對象),也可以使用下面的OnFields內:

t => t.OnFieldsWithBoost(qs => qs.Add(entry => entry.Name, 4.0) 
          .Add(entry => entry.Author, 3.0) 
          .Add(entry => entry.Summary, 2.0) 
          .Add(entry => entry.Body, 1.0)) 
+1

(+1)爲您解釋。我有一個場景,其中有多個字段(超過30個),我需要'field1'和'field2'具有最高優先級,剩餘字段的剩餘部分具有較低和相同的優先級。那麼,有沒有辦法,我只能在查詢中提供更高優先級的字段,而不是像示例查詢中那樣保留查詢中的所有字段? – oblivion

相關問題