有人可以帮我做一个查询,如果该字段不是请求中查询的一部分,它将根据某个字段的值对结果项进行排序。我有一个查询:
{
"_source": [
"ico",
"name",
"city",
"status"
],
"sort": {
"_score": "desc",
"status": "asc"
},
"size": 20,
"query": {
"bool": {
"should": [
{
"match": {
"normalized": {
"query": "idona",
"analyzer": "standard",
"boost": 3
}
}
},
{
"term": {
"normalized2": {
"value": "idona",
"boost": 2
}
}
},
{
"match": {
"normalized": "idona"
}
}
]
}
}
}
根据字段状态按字母升序对结果进行排序。 Status包含一些值,例如[active,canceled,old ....],我需要对查询中的每个可能值进行增强的操作。例如。主动升压5,取消升压4,旧升压3 ...........可以这样做吗?谢谢。
答案 0 :(得分:1)
您需要custom sort using script才能实现所需的目标。
我刚刚对查询使用了通用match_all
查询,您可能可以继续在其中添加查询逻辑,但是您要寻找的解决方案在sort
部分中以下查询。
确保status
是keyword类型
POST <your_index_name>/_search
{
"query":{
"match_all":{
}
},
"sort":[
{ "_score": "desc" },
{
"_script":{
"type":"number",
"script":{
"lang":"painless",
"inline":"if(params.scores.containsKey(doc['status'].value)) { return params.scores[doc['status'].value];} return 100000;",
"params":{
"scores":{
"active":5,
"old":4,
"cancelled":3
}
}
},
"order":"desc"
}
}
]
}
在上述查询中,继续并在查询的scores
部分中添加值。例如如果您的值为new
,而您希望它的值为2
,那么您的得分将在下面:
{
"scores":{
"active":5,
"old":4,
"cancelled":3,
"new":6
}
}
因此,基本上,文档将首先按照_score
进行排序,然后在经过排序的文档上执行script sort。
请注意,脚本排序本质上是desc
,因为我知道您想在顶部显示active
个文档,然后显示其他值。随便玩吧。
希望这会有所帮助!