弹性搜索 - 使用缺少的参数

时间:2016-04-18 21:12:27

标签: sorting elasticsearch filter

我正在尝试通过两个不同的字段对Elastic Search查询应用排序:

price_soldprice_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']"}]

简单地添加这两种类型会给我带来理想的结果吗?

感谢。

2 个答案:

答案 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

fromsize在我的ElasticSearch版本(5.1.1)中运行良好。 为确保您的算法正常工作,请检查响应中生成的值,例如:"sort" : [ 5.0622E7 ]