【问题标题】:How do I get the length of an array using an elasticsearch query in the ELK stack?如何使用 ELK 堆栈中的弹性搜索查询获取数组的长度?
【发布时间】:2019-02-01 03:04:56
【问题描述】:

我正在使用 Kibana 并且有一个看起来像这样的索引

GET index_name/

{
  "index_name": {
    "aliases": {},
    "mappings": {
      "json": {
        "properties": {
          "scores": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }

我想获取每条记录的scores 数组的长度(即其中有多少text 元素),最终目标是过滤掉长度大于或等于的记录20. 到目前为止,我能够识别(突出显示)每个为“20”的记录,但似乎无法构建一个过滤器,然后我可以将其转换为布尔值(1 表示真)供以后使用/对满足条件的记录求和。单击“编辑查询 DSL”后,我将其放入发现面板的过滤器中:

{
  "query": {
    "match": {
      "scores": {
        "query": "20",
        "type": "phrase"
      }
    }
  }
}

编辑:文档中此字段的示例是:

scores:12, 12, 12, 20, 20, 20

在表格选项卡视图中,它旁边有一个t,表示text。此字段的长度因记录而异,从 1 到 20 多个项目不等。我也不知道如何通过查询(仅)获取该字段的长度,但我看到了一些其他答案,这些答案暗示了这样的事情(这对我来说会产生错误):

"filter" : {
    "script" : {
        "script" : "doc['score'].values.length > 10"
    }
}

【问题讨论】:

  • scores 字段和文本值数组吗?你能分享一个例子吗?
  • @NishantSaini 为问题添加了一些上下文,谢谢。
  • 对不起,但需要更多的说明,例如。你补充说,分数的长度是多少?是 6 点吗?
  • @NishantSaini 是不是更清楚了?
  • 如果scoretext 类型,那么你不能使用doc['score'].values.length。相反,如果有keyword 类型的子字段,那么您可以使用doc['score.keyword'].values.length

标签: elasticsearch logstash kibana elastic-stack


【解决方案1】:

有几个选项

这是查找任意大小的项目的数量(通过,分隔)。

{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source":"/, /.split(doc['score.keyword'].value).length > 20"
          }
        }
      }
    }
  }
}

注意:对于上述解决方案,script.painless.regex.enabled: true 中的elasticsearch.yml 是必需的。

如果所有分数都具有特定大小(即只有两位数),则字符串长度(如您所尝试的那样)将起作用:

{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source":"doc['scores.keyword'].value.length() > 78"
          }
        }
      }
    }
  }
}

我选择了78,因为每一项(假设2位)是2位+,==4,你想看到大于20的,就是19 * 4 + 2

如果您经常关心这个分数数组的大小,您可能应该这样存储它。您可以使用split processor 在您的摄取管道中进行处理以实现此目的。

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2023-03-07
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多