Elasticsearch:文本搜索中的字段级自定义分数

时间:2015-06-14 19:21:46

标签: elasticsearch full-text-search

我刚开始探索elasticsearch。我需要找到一种在字段级别指定自定义分数的方法。例如:

我有一个名为blog的集合,其文档格式如下:

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

如果我搜索文字' xyz'在集合中,结果应反映以下评分标准

  • 在该字段中匹配' name'优先级为1。
  • 作者字段中的
  • 匹配具有第二优先级。
  • 夏日的比赛有第三优先。
  • 身体中的匹配优先级最低。

我需要根据上述标准获得前10名的结果。

1 个答案:

答案 0 :(得分: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#Object to 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))