【问题标题】:Elasticsearch - provided multi-field valueElasticsearch - 提供多字段值
【发布时间】:2021-06-22 20:45:41
【问题描述】:

我的索引中有一个带有持续时间字段的文档,以周期/持续时间格式表示,例如P1DT3H4S。

理想情况下,我会让 Elasticsearch 在多字段中将其解析为毫秒。显然 Elasticsearch 无法做到这一点。

下一个最好的方法是自己将周期转换为毫秒并将其存储在多字段中。这可能吗?

我想得到什么结果:

duration 的值类似于 PT4M20S

duration.millis 对应的值为260000

【问题讨论】:

  • 可以让 ES 为你计算它,但结果不会存储在多字段中,只是存储在两个单独的字段中。对你来说可以吗?
  • 我可以在代码中做到这一点并存储在一个单独的字段中。但是如何让 Elasticsearch 计算它呢?

标签: elasticsearch


【解决方案1】:

您可以将自己从这种逻辑中解救出来,让 ES 使用 ingest pipelinescript processor 为您做这件事。

首先,您需要创建一个摄取管道,它将获取持续时间字符串并将其解析为毫秒:

PUT _ingest/pipeline/duration2ms
{
  "processors": [
    {
      "script": {
        "source": """
            ctx.durationInMillis = Duration.parse(ctx.duration).getSeconds() * 1000;
          """
      }
    }
  ]
}

然后,当您索引文档时,您可以引用该管道,如下所示:

PUT index/_doc/1234?pipeline=duration2ms
{
  "duration": "P1DT3H4S"
}

将被索引的文档将如下所示:

{
  "duration" : "P1DT3H4S",
  "durationInMillis" : 97204000
}

【讨论】:

  • 在这种情况下,我能否有一个名为“duration.millis”的别名来引用 durationInMillis?
  • 它有什么不同?您可以随意命名该字段
  • 由于duration已经是一个关键字,它不能是一个对象。所以我不能简单地存储一个同时具有持续时间(关键字)字段和持续时间.millis(长)字段的文档
  • 是的,这就是为什么你需要两个不同的字段,多字段在这里不起作用。你可以有一个对象字段{"duration": {"keyword": "P1DT3H4S", "millis": 97204000}}
  • 技术上这很好用。我遇到的问题是持续时间字段是公共的,并且必须将值作为 ISO 持续时间。此外,用户可以使用 lucene 语法查询数据。我真的希望用户能够将毫秒值称为 duration.millis。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 2013-12-24
  • 2021-09-14
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
相关资源
最近更新 更多