无法遍历数组字段ES 6.1

时间:2018-01-23 13:00:49

标签: elasticsearch

我在ElasticSearch 6.1中遇到一个我无法解决的问题,我不知道为什么。我已经多次阅读过这些文档,也许我错过了一些东西。

我有一个脚本化查询,需要先做一些计算才能确定记录是否可用。

以下是以下脚本: https://gist.github.com/dunice/a3a8a431140ec004fdc6969f77356fdf

我正在尝试使用以下源代码遍历数组字段:

  "unavailability": [
    {
      "starts_at": "2018-11-27T18:00:00+00:00",
      "local_ends_at": "2018-11-27T15:04:00",
      "local_starts_at": "2018-11-27T13:00:00",
      "ends_at": "2018-11-27T20:04:00+00:00"
    },
    {
      "starts_at": "2018-12-04T18:00:00+00:00",
      "local_ends_at": "2018-12-04T15:04:00",
      "local_starts_at": "2018-12-04T13:00:00",
      "ends_at": "2018-12-04T20:04:00+00:00"
    },
  ]

执行脚本时会抛出错误:在使用[飞机]类型进行映射时找不到[不可用]字段

是否有任何线索可以使其发挥作用?

由于

更新

查询: https://gist.github.com/dunice/3ccd7d83ca6ddaa63c11013b84e659aa

更新2

映射: https://gist.github.com/dunice/f8caee114bbd917115a21b8b9175a439

数据示例: https://gist.github.com/dunice/8ad0602bc282b4ca19bce8ae849117ad

2 个答案:

答案 0 :(得分:0)

您无法通过doc_values(即doc)访问源文档中的数组。您需要通过_source变量直接访问源文档,如下所示:

for(int i = 0; i < params._source['unavailability'].length; i++) {

请注意,根据您的ES版本,您可能需要尝试ctx._source或仅_source而不是params._source

答案 1 :(得分:0)

我用不同的方法解决了我的用例。

相反,将字段作为像unavailability这样的对象数组,我决定创建两个字段作为datetime数组: unavailable_from unavailable_to

我的脚本遍历第一个字段,然后检查具有相同位置的第二个字段。

<强>更新

默认情况下禁用对_source的直接访问: https://github.com/elastic/elasticsearch/issues/17558