elasticsearch Kibana是一个脚本字段,在数组中循环,elasticsearch,kibana,metricbeat,elasticsearch,Kibana,Metricbeat" /> elasticsearch Kibana是一个脚本字段,在数组中循环,elasticsearch,kibana,metricbeat,elasticsearch,Kibana,Metricbeat" />

elasticsearch Kibana是一个脚本字段,在数组中循环

elasticsearch Kibana是一个脚本字段,在数组中循环,elasticsearch,kibana,metricbeat,elasticsearch,Kibana,Metricbeat,我正在尝试使用metricbeat http模块来监视F5池 我向F5API发出请求并带回json,json保存到kibana。但是json包含一个池成员数组,我想数一数池成员的数目 建议是,这可以通过脚本字段来完成。但是,我无法获取用于检索数组的脚本。乙二醇 doc['http.f5pools.items.monitor'].value.length() 在预览结果中返回,并添加相同的“附加字段”进行比较: [ { "_id": "rT7wdGsBXQSGm_pQoH6Y", "h

我正在尝试使用metricbeat http模块来监视F5池

我向F5API发出请求并带回json,json保存到kibana。但是json包含一个池成员数组,我想数一数池成员的数目

建议是,这可以通过脚本字段来完成。但是,我无法获取用于检索数组的脚本。乙二醇

doc['http.f5pools.items.monitor'].value.length()
在预览结果中返回,并添加相同的“附加字段”进行比较:

[
 {
  "_id": "rT7wdGsBXQSGm_pQoH6Y",
  "http": {
   "f5pools": {
    "items": [
     {
      "monitor": "default"
     },
     {
      "monitor": "default"
     }
    ]
   }
  },
  "pool.MemberCount": [
   7
  ]
 },
如果我尝试

doc['http.f5pools.items']
或者类似的,我只是得到一个错误:

"reason": "No field found for [http.f5pools.items] in mapping with types []"
谷歌搜索表明doc构造不包含数组

  • 是否可以创建一个脚本字段来访问该组值?ie是我的代码或我索引数据的方式错误
  • 如果没有,metricbeats中是否有其他方法?我不想做一个全新的api来进行计算,并添加一个单独的字段
  • --更新

    奇怪的是,数组中的数值似乎确实返回了预期的结果。即

    doc['http.f5pools.items.ratio']
    
    返回

     {
      "_id": "BT6WdWsBXQSGm_pQBbCa",
      "pool.MemberCount": [
       1,
       1
      ]
     },
    
    --更新2

    好的,如果字段中的字符串有不同的值,那么您将得到所有的值。如果它们是一样的,你只会得到一个。wtf?

    好的,解决了

    因此,正如我发现的那样,数组被预过滤为只返回不同的值(ints的情况除外?)

    解决方案是使用
    params.\u source
    而不是
    doc[]

    引述如下:

    文档值是一个列式字段值存储,默认情况下在所有 除已分析的文本字段之外的字段

    文档值只能返回“简单”字段值,如数字、日期、, 地理点、术语等,或这些值的数组(如果字段为 多值。它无法返回JSON对象

    另外,添加空检查也很重要,如下所述:

    缺少字段

    如果字段为空,文档['field']将抛出错误 映射中缺少。在无痛状态下,可以先用 doc.containsKey('field')*用于保护对文档映射的访问。 不幸的是,无法检查字段的存在 在表达式脚本中的映射中

    引述如下:

    文档源实际上只是一个特殊的存储字段,可以 可以使用_source.field_name语法访问。_源已加载 作为贴图的贴图,因此可以访问对象字段中的属性 例如,_source.name.first

    以一个例子回应您的评论:

    这里的kyeword是:它不能返回JSON对象。字段doc['http.f5pools.items']是一个JSON对象

    尝试在下面运行并查看它创建的映射:

    PUT t5/doc/2
    {
       "items": [
         {
          "monitor": "default"
         },
         {
          "monitor": "default"
         }
        ]
    }
    
    
    GET t5/_mapping
    
    {
      "t5" : {
        "mappings" : {
          "doc" : {
            "properties" : {
              "items" : {
                "properties" : {
                  "monitor" : {  <-- monitor is a property of items property(Object)
                    "type" : "text",
                    "fields" : {
                      "keyword" : {
                        "type" : "keyword",
                        "ignore_above" : 256
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    
    PUT t5/doc/2
    {
    “项目”:[
    {
    “监视器”:“默认值”
    },
    {
    “监视器”:“默认值”
    }
    ]
    }
    获取t5/_映射
    {
    “t5”:{
    “映射”:{
    “文件”:{
    “财产”:{
    “项目”:{
    “财产”:{
    
    “监视器”:{我正在添加另一个答案,而不是删除我以前的答案,这不是实际问题,但将来可能对其他人有帮助

    我在报告中发现了一个提示:

    文档值是一个列式字段值存储

    在谷歌上进一步搜索后,我发现了这样一个信息:doc值本质上是“未转换的索引”对于排序之类的操作很有用;我的假设是,在排序时,基本上不希望重复相同的值,因此它们使用的数据结构会删除这些重复项。这仍然无法解释为什么它对字符串和数字的作用不同。数字会被保留,但字符串会被过滤为唯一的

    这种“未转换”的结构在其他语言中通常称为“列存储” 基本上,它存储单个字段的所有值 集中在一列数据中,这使得 像排序这样的操作

    在Elasticsearch中,此列存储称为文档值,并且 默认情况下启用。文档值在索引时创建:当字段 索引后,Elasticsearch将标记添加到 搜索。但它也会提取术语并将其添加到专栏中 文档值

    还有一些实际上是为了高效和内存友好的操作而使值加倍

    上面的链接给出了一个注释,回答了这个问题:

    你可能会想,“这对于数字来说很好,但是对于数字呢 字符串?“字符串在序数的帮助下进行类似的编码 表。字符串被消除重复并排序到一个表中,然后分配 一个ID,然后这些ID被用作数字文档值 字符串与数字具有许多相同的压缩优势

    顺序表本身有一些压缩技巧,例如使用 固定、可变或前缀编码字符串


    另外,如果你不希望出现这种行为,那么你可以

    如果有人能解释为什么我会接受你的回答是的,这取决于值和映射。是否进行了分析。答案都在文档中。你能给我指出文档中的一点吗,即当值为str时,数组将被预过滤为唯一值ing?它没有说那些确切的词,但它说它不能返回JSON对象。字段
    doc['http.f5pools.items']
    是一个JSON对象。@Ewan还添加了一个示例。希望这能增加一些清晰度。我认为您没有抓住要点。我理解它不能返回对象。但它可以返回对象的字段作为数组。除非字段类型是字符串,它只返回不同的值,而不是您认为找到的所有值。请参阅关于kibana/Elastic的一些不直观的东西是的,这更多的是关于数据结构的部分,这不容易理解。但是很好知道。谢谢