我刚开始探索elasticsearch。我需要找到一种在字段级别指定自定义分数的方法。例如:
我有一个名为blog的集合,其文档格式如下:
{
"_id": "1736hst26672829",
"name": "Learning regular expressions basics",
"author": "John Lee",
"summery": "Here is summery.",
"body": "Content of the blog."
}
如果我搜索文字' xyz'在集合中,结果应反映以下评分标准
我需要根据上述标准获得前10名的结果。
答案 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))