我正在尝试通过两个不同的字段对Elastic Search查询应用排序:
price_sold
和price_list
我想首先对price_sold
进行排序,但如果该值为null,我希望按price_list
排序
如果我只是将排序设置为:
,查询是否正确"sort": [
{ "price_sold": { "order": "desc"}},
{ "price_list": { "order": "desc"}}
]
我已经执行了查询,我没有收到任何错误,结果似乎是正确的,但是如果我忽略了某些东西,我很好奇。
我一直在阅读有关missing
过滤器以及可能使用custom value
的信息。这可能不是必需的,但我不太确定。
是否有办法定义第二个字段,以便在第一个字段丢失时进行排序,还是不必要?类似的东西:
"sort": [{"price_sold: {"order": "desc", "missing": "doc['field_name']"}]
简单地添加这两种类型会给我带来理想的结果吗?
感谢。
答案 0 :(得分:2)
我想我明白你在问什么。在SQL术语中,您希望 ORDER BY COALESCE(price_sold,price_list)DESC 。
您列出的第一种有点不同。它类似于 ORDER BY price_sold DESC,price_list DESC - 换句话说,主要排序是通过price_sold,对于price_sold相等的条目,次要排序是通过price_list。
如果“失踪”以这种方式工作,那么你的第二次排序尝试会很棒。不幸的是,缺少“自定义”选项似乎只允许您指定一个常量值。
如果您不需要使用from和size限制搜索,则应该能够使用sort的_script选项编写一些适合您的逻辑。我最终在这里,因为我使用from和size来检索批次,当我按_script排序时,我得到的项目没有意义 - 项目排序正确,但我没有得到正确的项目。所以,我添加了一个新的分析器并扩展了我的字段以使用新的分析器,我希望能够使用新字段进行排序,或者如果新字段不存在(对于以前索引的项目),请使用相反,旧场的价值。但这似乎不可能。我想我将不得不重新索引我的项目,以便填充我的新字段。
答案 1 :(得分:2)
如果有人仍然在寻找,我最终创建了一个类似于此的脚本:
curl -XGET 'localhost:9200/_search?pretty&size=10&from=0' -H 'Content-Type: application/json' -d'
{
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"inline": "doc[\u0027price_sold\u0027] == null ? doc[\u0027price_list\u0027].value : doc[\u0027price_sold\u0027].value"
},
"order" : "desc"
}
},
}
'
对于排序日期,类型仍然必须保持number
,但您将.value
替换为.date.getMillisOfDay()
,如所讨论的here。
from
和size
在我的ElasticSearch版本(5.1.1)中运行良好。
为确保您的算法正常工作,请检查响应中生成的值,例如:"sort" : [ 5.0622E7 ]
。