1

我对 Elasticsearch 有一个有趣的排序问题。我有以下数据:

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

上图显示,我有 6 条数据,项 AF,它们分别出现在 -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' } },
]

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

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

任何帮助将非常感激。

4

1 回答 1

2

我相信你很接近,但必须为“未来”日期返回一些值而不是 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' } },
]
于 2017-12-13T22:21:28.900 回答