【问题标题】:Elasticsearch: conditionally sort on 2 fields, 1 replaces the other if it existsElasticsearch:有条件地对2个字段进行排序,如果存在则1替换另一个
【发布时间】:2016-12-01 10:15:28
【问题描述】:

没有脚本,我需要根据评分对记录进行排序。所有记录都存在系统评级,但用户评级可能存在也可能不存在。如果确实存在用户评分,我想在排序中使用该值而不是系统评分,用于该特定记录并且仅用于该记录。

尝试查看missing 设置,但它只允许_first_last 或自定义值(将用于缺少文档作为排序值):

{
    "sort" : [
        { "user_rating" : {"missing" : "_last"} },
    ],
    "query" : {
        "term" : { "meal" : "cabbage" }
    }
}

...但是当user_rating 丢失时,有没有办法指定自定义值应该是system_rating

我可以做到以下几点:

query_hash[:sort] = []
if user_rating.exist?
  query_hash[:sort] << {
    "user_rating" => {
      "order": sort_direction,
      "unmapped_type": "long",
      "missing": "_last",
    }
  }
end
query_hash[:sort] << {
  "system_rating" => {
    "order": sort_direction,
    "unmapped_type": "long",
  }
}

...但是无论user_rating 的值如何,这始终会将用户评分记录排在最前面。

我知道脚本可以让我这样做,但我们不能使用脚本。有可能吗?

【问题讨论】:

  • 编写脚本或在索引时构建一个自定义字段,该字段将包含已构建的排序值。
  • 很遗憾,@andrei-stefan,我相信你是对的。在下面添加您的评论作为答案,如果没有其他答案,我会在一两天后接受。

标签: ruby sorting elasticsearch


【解决方案1】:

唯一的方法是在索引时编写脚本或构建一个自定义字段,该字段将包含已构建的排序值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2023-01-19
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多