【问题标题】:Logstash. Nested object mapping with ruby script日志存储。使用 ruby​​ 脚本的嵌套对象映射
【发布时间】:2019-01-17 22:42:04
【问题描述】:

我遇到了 ruby​​ 过滤器插件的嵌套对象映射问题。 我的对象应该有字段 cmds,它是这样的对象数组:

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

通过 elasticsearch,我需要找到 number = 91error_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 字段映射为嵌套类型而不是类型对象。 问题是我不知道如何在我的 logstash ruby​​ 脚本中使用 event.set

我有以下代码:

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

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

【问题讨论】:

    标签: ruby elasticsearch logstash elastic-stack


    【解决方案1】:

    好的,我做到了。我还是 ELK 的新手,有时我很困惑(ruby 中的 logstash/kibana/scripts)我应该在哪里做需要做的事情。

    我的代码没问题。使用 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"
                  }
                }
    
      }
    }
      }}
    
    }
    

    之前我试图通过将“type”设置为“nested”来创建新索引

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

    但它工作不正常(“cmds”字段未添加到 elasticsearch)所以我通过完整映射(所有属性)来完成。

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2013-08-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多