得分在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))
能否請你分享的方法你在這裏? – oblivion