如何从Elasticsearch索引中的两个字段派生一个字段?

时间:2019-01-15 08:42:12

标签: elasticsearch curl vega

我有一个包含字段的索引:

  • room_name
  • 开始日期(使用开始时间的房间)
  • 结束日期(已使用结束时间的房间)

我正在创建一个curl命令,其中可以获取使用房间的时间。

有可能吗?

这是当前的curl命令:

prov

这是结果:

chart.groupBars(0f, 0.8f, 0.1f)

但是我在“ 聚合”中的预期结果如下:

curl -XGET "https://localhost:9200/testindex/_search?pretty" -H 'Content-Type: application/json' -d'
{
    "aggs": {
        "room_bucket":{
            "terms": {
                "field": "room_name.keyword",
            },
            "aggs":{
                "hour_bucket": {
                    "terms": {
                        "script": {
                            "inline": "def l = doc[\"start_date \"].value;\nif ( l <= 20 && l >= 9 ) {\n  return l;\n}",
                            "lang": "painless"
                        },
                        "order": {
                            "_key": "asc"
                     },
                     "value_type": "long"
                    }
                }
            }
        }
    }
}'

在当前结果中,它仅读取开始日期

但是,在预期的输出中, Room_V 应该具有“ key” = 11 “ key” = 12 “ key” = 13 (每个键的 doc_count 应该为1),因为基于开始日期和结束日期,会议室的使用时间为11-13。

1 个答案:

答案 0 :(得分:1)

您可以通过利用LongStream并创建间隔中所有小时数的数组来实现所需的目标,如下所示:

curl -XGET "https://localhost:9200/testindex/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "aggs": {
    "room_bucket": {
      "terms": {
        "field": "room_name.keyword"
      },
      "aggs": {
        "hour_bucket": {
          "terms": {
            "script": {
              "inline": """
              return LongStream.rangeClosed(doc.start_date.value, doc.end_date.value).toArray();

""",
              "lang": "painless"
            },
            "order": {
              "_key": "asc"
            },
            "value_type": "long"
          }
        }
      }
    }
  }
}'
相关问题