ruby-on-rails - ElasticSearch Rails:如果存在,则按date1排序,否则按date2排序

标签 ruby-on-rails elasticsearch

enter image description here

上面是我们存储在elasticsearch中的Posts模型的两条不同记录。我们正在尝试采用一种逻辑,以便将粘性帖子过期后像常规帖子一样放入Feed中。

我们要说

“如果将来将来is_stickystickied_untilstickied_until排序,否则按created_at排序”

我想我可以在SQL中使用它(因为我们在那里存储了大量数据,而在ES中仅存储可搜索字段),看起来像

ORDER BY
  CASE
  WHEN stickied_until >= '#{DateTime.now.utc}'
  THEN stickied_until
  ELSE created_at
END DESC

但是接下来有两件事控制着排序,我很确定这会导致错误,而且感觉也很不对。

在ES中可以进行这种条件排序吗?

最佳答案

您必须为此使用排序脚本。

{
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": {
          "lang": "painless",
          "source": """
            def is_sticky = doc['is_sticky'].value;
            def created_at = doc['created_at'].value.getMillis();
            if (!is_sticky) {
              return created_at;
            }

            def stickied_until =  doc['stickied_until'].value.getMillis();
            def now = params['now'];

            if (is_sticky && stickied_until > now) {
              return stickied_until;
            }

            return created_at;
          """,
          "params": {
            "now": 1586798403888
          }
        },
        "order": "desc"
      }
    }
  ]
}

请注意,由于docs中所述的原因,我使用了查询时间常量params['now']

关于ruby-on-rails - ElasticSearch Rails:如果存在,则按date1排序,否则按date2排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61192893/

相关文章:

ruby-on-rails - HTML 表单命名约定的名称

elasticsearch - 如何在 Elasticsearch 5 中强制合并段?

elasticsearch - 如何在Grafana中为Cloud上的DB应用程序(Elasticsearch)指定URL

ruby-on-rails - ActiveRecord 中的零个或多个关联

ruby-on-rails - 在 ActiveRecord 查询中返回另一个模型的结果

ruby-on-rails - Rails 语言环境开发服务器 "rails s"同时服务多个请求

elasticsearch - 使用 '-'的查询在ElasticSearch NEST 7.x中返回不正确的结果

ruby-on-rails - Ruby on Rails link_to 指向 Index 而不是 Show

elasticsearch - 简单的 Elasticsearch 输入 - 拒绝映射更新最终映射将有超过 1 种类型 : [_doc, doc]

amazon-web-services - 不同地区的 Elasticsearch 看不到对方