Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ElasticSearch Rails:按日期1排序(如果为';s现在和将来,否则按日期排序2_Ruby On Rails_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Ruby On Rails,elasticsearch" /> elasticsearch,Ruby On Rails,elasticsearch" />

Ruby on rails ElasticSearch Rails:按日期1排序(如果为';s现在和将来,否则按日期排序2

Ruby on rails ElasticSearch Rails:按日期1排序(如果为';s现在和将来,否则按日期排序2,ruby-on-rails,elasticsearch,Ruby On Rails,elasticsearch,以上是我们存储在elasticsearch中的Posts模型中的两个不同记录。我们试图在逻辑上把我们的粘性帖子放到feed中,就像普通帖子过期后一样 我们想让它说 “如果是粘滞的并且粘滞的在将来按粘滞的排序,否则按在创建的排序” 我认为它是在SQL中工作的(因为我们在那里存储了大量数据,并且只在ES中存储了可搜索的字段),看起来 ORDER BY CASE WHEN stickied_until >= '#{DateTime.now.utc}' THEN stickied_un

以上是我们存储在elasticsearch中的
Posts
模型中的两个不同记录。我们试图在逻辑上把我们的粘性帖子放到feed中,就像普通帖子过期后一样

我们想让它说

“如果
是粘滞的
并且
粘滞的
在将来按
粘滞的
排序,否则按在创建的
排序”

我认为它是在SQL中工作的(因为我们在那里存储了大量数据,并且只在ES中存储了可搜索的字段),看起来

ORDER BY
  CASE
  WHEN stickied_until >= '#{DateTime.now.utc}'
  THEN stickied_until
  ELSE created_at
END DESC
但是有两件事可以控制排序,我很确定这会导致bug,而且感觉不对


是否可以在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"
      }
    }
  ]
}

请注意,我使用了查询时间常数
params['now']
,原因如下。

您使用的是什么版本的elasticsearch?@AlkisKalogeris 5.4我相信根据您的ES版本,您可能需要使用
doc['created_at'].date.getMillis()
而不是
doc['created_at'].value.getMillis()
。谢谢!我使用的是ES 5.4,所以我必须更改为
doc['created_at'].date.getMillis()
,否则这就像一个符咒