【问题标题】:Elastic Search - Sort by multiple fields with the missing parameter弹性搜索 - 按缺少参数的多个字段排序
【发布时间】:2017-10-30 22:45:01
【问题描述】:

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

price_soldprice_list

我想先按price_sold排序,但如果该值为空,我想再按price_list排序

如果我只是将排序设置为,查询是否正确:

"sort": [
 { "price_sold": { "order": "desc"}},
 { "price_list": { "order": "desc"}}
]

我已经执行了查询,我没有收到任何错误,而且结果似乎是正确的,但是我很好奇我是否忽略了一些东西。

我一直在阅读有关missing 过滤器的信息,以及可能使用custom value。这可能不是必需的,但我不太确定。

如果第一个字段丢失,是否有办法定义第二个字段进行排序,或者这不是必需的?比如:

"sort": [{"price_sold: {"order": "desc", "missing": "doc['field_name']"}]

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

谢谢。

【问题讨论】:

  • 听起来您没有尝试您要询问的查询...
  • 执行查询时遇到什么错误?
  • 我已经尝试了查询,第一组排序没有给出错误,我只是好奇是否有更好的方法或者我是否忽略了某些东西。第二个查询不起作用,但这是预期的,因为我无法找到任何支持该格式的文档 - 它更多的是伪代码试图理解这一点。
  • @AndreiStefan 是的,我看到了missing 选项,但是我不认为将其设置为 _first 或 _last 是我想要的。我对custom value 很好奇,但没有看到任何其他关于如何在这种情况下使用它的文档。

标签: sorting elasticsearch filter


【解决方案1】:

如果有人还在寻找我最终创建了一个类似这样的脚本:

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 ]

【讨论】:

  • 看来你的 nullcheck 逻辑在这里颠倒了;不应该是"inline": "doc[\u0027price_sold\u0027] != null ? doc[\u0027price_sold\u0027].value : doc[\u0027price_list\u0027].value"吗?
【解决方案2】:

我想我明白你在问什么。在 SQL 术语中,您希望 ORDER BY COALESCE(price_sold, price_list) DESC

您列出的第一种有点不同。它类似于 ORDER BY price_sold DESC, price_list DESC - 换句话说,主要排序是按 price_sold,对于 price_sold 相等的条目,次要排序是按 price_list。

如果“失踪”以这种方式工作,您的第二次排序尝试会很棒。不幸的是,missing 的“自定义”选项似乎只允许您指定一个常量值。

如果您不需要使用 from 和 size 限制搜索,您应该能够使用 sort 的 _script 选项来编写一些适合您的逻辑。我最终来到这里是因为我确实使用 from 和 size 来检索批次,当我按 _script 排序时,我得到的项目没有意义 - 项目排序正确,但我没有得到正确的集合项目。所以,我添加了一个新的分析器并扩展了我的字段以使用新的分析器,我希望能够使用新字段进行排序,或者,如果新字段不存在(对于以前索引的项目),使用而是旧字段的值。但这似乎是不可能的。我想我将不得不重新索引我的项目,以便填充我的新字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2016-06-04
    • 2020-09-11
    • 2017-02-09
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多