Elasticsearch 使用脚本对日期桶进行排序

Elasticsearch sorting buckets of dates with script

我在使用 Elasticsearch 时遇到了一个有趣的排序问题。我有以下数据:

Item =>     A     B      C         D    E    F
Time =>    -3    -2     -1    0    1    2    3

上图显示我有6条数据,A-F项,每条数据都发生在-3到3之间的某个时间,当前时间为t0。

我希望在 Elasticsearch 中创建一个排序,它按以下顺序对项目进行排序:

DEFCBA

也就是说,未来发生的项目排在结果的第一位,并按升序排列,过去发生的项目排在结果的第二位,并按降序排列。

到目前为止,我有以下排序:

sort: [
  {
    _script: {
      type: 'number',
      script: {
        lang: 'painless',
        inline: "if (doc['item_date'].value - params.current_time > 0) {return 1;} else {return 0}",
        params: {
          current_time,
        },
      },
      order: 'desc',
    },
  },
  { item_date: { order: 'desc' } },
]

上面确实把未来的项目放在第一位,过去的项目放在第二位,但它没有按升序排列未来的项目(它对过去的项目和所有项目按降序排序)。

我不确定我可以编写什么脚本来根据第一个脚本的结果将未来的项目与过去的项目分开排序。

如有任何帮助,我们将不胜感激。

我相信你很接近,但必须 return 一些值而不是 "future" 日期的 1。

尝试用 1 代替 1.0/doc['start_date'].value,使其与日期成反比(日期值越大越远)。

完整示例如上:

sort: [
  {
    _script: {
      type: 'number',
      script: {
        lang: 'painless',
        inline: "if (doc['item_date'].value > params.current_time) {return 1.0/doc['start_date'].value;} else {return 0}",
        params: {
          current_time,
        },
      },
      order: 'desc',
    },
  },
  { item_date: { order: 'desc' } },
]