我正在使用Django,Haystack和ElasticSearch。我想订购我的搜索结果,以便有序字段值为空(“”)的结果出现在非空的结果之后。我在Haystack中找不到可以做到这一点的API。发送给ElasticSearch的请求如下所示:
{
"sort":[
{
"version":{
"order":"asc"
}
}
],
"query":{
...
}
}
有没有办法重写这个ElasticSearch查询,以便“version”的空字符串结果出现在“version”存在的结果之后?
我在Python中实现了这个:
sorted(sqs, key=lambda x: getattr(x, 'version') == '')
答案 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"}
}
]
}