Logstash。使用ruby脚本的嵌套对象映射

时间:2018-08-10 10:25:11

标签: ruby elasticsearch logstash elastic-stack

我在使用ruby过滤器插件进行嵌套对象映射时遇到问题。 我的对象应该具有字段cmds,它是这样的对象数组:

 "cmds": [
            {
              "number": 91,
              "errors": [],
              "errors_count": 0
            },
            {
              "number": 92,
              "errors": ["ERROR_1"],
              "errors_count": 1
            }]

通过elasticsearch,我需要找到 number = 91 error_count > 0 的对象。因此,上面的对象应该是正确的结果。但是我的查询(如下)与之匹配。

GET /logs/default/_search
{
    "query": {
    "bool": {
      "must": [
        {
          "match": {
            "cmds.number": 91
          }
        },
        {
         "range": {
           "cmds.errors_count": {
             "gt": 0

           }
         }
        }]}}

我知道这是因为JSON document is flattened into a simple key-value format ,我应该将cmds字段映射为嵌套类型而不是对象类型。 问题是我不知道如何在带event.set

的Logstash红宝石脚本中执行此操作

我有以下代码:

for t in commandTexts do

    commandv = Command.new(t)

    if i==0
        event.set("[cmds]", ["[number]" => commandv.hexnumber, 
                            "[command_text]" => commandv.command_text, 
                            "[errors]" => commandv.errors, 
                            "[has_error]" => commandv.has_error, 
                            "[errors_count]" => commandv.errors_count])      
    else
        event.set("[cmds]", event.get("cmds") + ["[number]" => commandv.hexnumber,
                                                 "[command_text]" => commandv.command_text, 
                                                 "[errors]" => commandv.errors,
                                                 "[has_error]" => commandv.has_error, 
                                                 "[errors_count]" => commandv.errors_count])

    end
    i+=1
   end
end

我是红宝石的新手,我的代码也不完美,但是在弹性搜索中,“ cmds”字段看起来不错。唯一的问题是没有嵌套。请帮忙。

1 个答案:

答案 0 :(得分:0)

好,我做到了。我对ELK还是很陌生,有时我感到困惑,我应该在哪里(logstash / kibana / scripts in ruby​​)应该做什么。

我的代码很好。使用kibana,我删除了索引,并使用正确的映射创建了一个新索引

代码:

PUT  /logs?pretty
{
  "mappings": {"default": {
"properties": {
  "cmds" : {
   "type" : "nested",
    "properties": {
              "command_text": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "errors": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "errors_count": {
                "type": "long"
              },
              "has_error": {
                "type": "boolean"
              },
              "number": {
                "type": "long"
              }
            }

  }
}
  }}

}

之前,我试图通过将“类型”设置为“嵌套”来创建新索引

  PUT  /logs?pretty
    {
      "mappings": {"default": {
    "properties": {
      "cmds" : {
       "type" : "nested"
      }


    }
    }}} 

但是它不能正常工作(“ cmds”字段未添加到elasticsearch中),所以我通过完全映射(所有属性)来做到这一点。