查询ElasticSearch最后命令空字符串

时间:2012-12-15 20:40:57

标签: django elasticsearch django-haystack

我正在使用Django,Haystack和ElasticSearch。我想订购我的搜索结果,以便有序字段值为空(“”)的结果出现在非空的结果之后。我在Haystack中找不到可以做到这一点的API。发送给ElasticSearch的请求如下所示:

{
   "sort":[
      {
         "version":{
            "order":"asc"
         }
      }
   ],
   "query":{
      ...
   }
}

有没有办法重写这个ElasticSearch查询,以便“version”的空字符串结果出现在“version”存在的结果之后?

我在Python中实现了这个:

sorted(sqs, key=lambda x: getattr(x, 'version') == '')

1 个答案:

答案 0 :(得分:2)

此查询将_score 1.0分配给所有具有非空版本且_score为2.0的记录到所有具有空版本的记录。然后它按_score按升序排序,然后按版本按升序排序。因此,所有具有空版本的记录都会被推送到列表的底部。

{
    "query": {
        "custom_filters_score" : {
            "query" : {
                "constant_score": {
                    "query": {
                        .... your original query ....                        
                    }
                }
            },
            "filters" : [
                {
                    "filter" : { "missing" : { "field" :  "version"} },
                    "boost" : "2"
                }
            ]
        }        
    },
    "sort": [
        {
            "_score": {"order":"asc"}
        },
        {
            "version": {"order":"asc"}
        }
    ]
}