Elasticsearch使用脚本

时间:2017-12-13 21:22:07

标签: sorting date elasticsearch scripting elasticsearch-painless

我对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' } },
]

以上将未来的项目放在第一位,将过去的项目放在第二位,但它不会按升序排序未来的项目(它按过程顺序对过去的项目和所有项目进行排序)。

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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' } },
]