代码之家  ›  专栏  ›  技术社区  ›  d8aninja

如何使用ELK堆栈中的elasticsearch查询获取数组的长度?

  •  1
  • d8aninja  · 技术社区  · 7 年前

    我正在使用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表示true),以便以后使用/求和满足条件的记录。单击“编辑查询DSL”后,我将其放入发现面板的过滤器中:

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

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

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

    在“表”选项卡视图中,它有一个 t 文本

    "filter" : {
        "script" : {
            "script" : "doc['score'].values.length > 10"
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Benjamin Trent    7 年前

    有两种选择

    这是为了找到任何大小的项目数量(通过 , ).

    {
      "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"
              }
            }
          }
        }
      }
    }
    

    , ==4,您希望看到大于20,即 19 * 4 + 2

    如果您经常关心这个分数数组的大小,您可能应该将其存储为这样的大小。您可以使用 split processor 为了实现这一点。

    推荐文章