Elasticsearch按不在过滤器中的字段值排序

时间:2019-08-12 09:57:32

标签: sorting elasticsearch boost

有人可以帮我做一个查询,如果该字段不是请求中查询的一部分,它将根据某个字段的值对结果项进行排序。我有一个查询:

{
    "_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 ...........可以这样做吗?谢谢。

1 个答案:

答案 0 :(得分:1)

您需要custom sort using script才能实现所需的目标。

我刚刚对查询使用了通用match_all查询,您可能可以继续在其中添加查询逻辑,但是您要寻找的解决方案在sort部分中以下查询。

确保statuskeyword类型

基于值的自定义排序

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个文档,然后显示其他值。随便玩吧。

希望这会有所帮助!