2

我正在使用 Django、Haystack 和 ElasticSearch。我想对我的搜索结果进行排序,以便排序字段值为空(“”)的结果排在不为空的结果之后。我在 Haystack 中找不到可以执行此操作的 API。发送到 ElasticSearch 的请求如下所示:

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

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

我在 Python 中实现了这一点:

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

1 回答 1

2

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

{
    "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"}
        }
    ]
}
于 2012-12-18T00:18:08.943 回答