【问题标题】:Logstash csv import - mutate add_field if not emptyLogstash csv 导入 - 如果不为空,则改变 add_field
【发布时间】:2018-08-22 16:11:56
【问题描述】:

我正在使用 logstash 将数据从 csv 文件导入到我们的弹性搜索中。

在导入期间,我想创建一个包含其他两个字段值的新字段。这是我导入的 sn-p:

    input {
          file {
            path => "/data/xyz/*.csv"
            start_position => "beginning"
            ignore_older => 0
            sincedb_path => "/dev/null"
          }
    }

    filter {
        if [path] =~ "csv1" {
            csv {
                  separator => ";"
                  columns =>
                  [
                    "name1",
                    "name2",
                    "name3",
                    "ID"              
                  ]
              }
                mutate {
                  add_field => {
                      "searchfield" => "%{name1} %{name2} %{name3}"
                }
            }
        }

    output {
           if [path] =~ "csv1" {
               elasticsearch {
                  hosts => "localhost"
                  index => "my_index"           
                  document_id => "%{ID}"
               }
           }
    }
}

这可以按需要工作,但是在例如 name3 为空的行上,logstash 将 %{name3} 写入新字段。有没有办法只添加不为空的值?

【问题讨论】:

    标签: elasticsearch logstash csv-import


    【解决方案1】:

    我认为除了检查name3 是否存在并基于此构建您的搜索字段之外别无他法。

    if [name3] {
      mutate {
        id => "with-name3"
        add_field => { "searchfield" => "%{name1} %{name2} %{name3}" }
      }
    } else {
      mutate {
        id => "without-name3"
        add_field => { "searchfield" => "%{name1} %{name2}" }
      }
    }
    

    或者,如果我正确理解您的问题,您显然希望将此数据发送到 Elasticsearch 并希望有一个可搜索的字段。为了避免源中的数据重复,您可以使用copy_to 语句构建搜索字段。您的映射如下所示:

    {
      "mappings": {
        "doc": {
          "properties": {
            "name1": {
              "type": "text",
              "copy_to": "searchfield" 
            },
            "name2": {
              "type": "text",
              "copy_to": "searchfield" 
            },
            "name3": {
              "type": "text",
              "copy_to": "searchfield" 
            },
            "searchfield": {
              "type": "text"
            }
          }
        }
      }
    }
    

    然后您就可以完美地针对该字段运行查询,而不会在源代码中出现重复。

    更新。基本上您的 logstash.conf 如下所示:

    input {
      file {
        path => "/data/xyz/*.csv"
        start_position => "beginning"
        ignore_older => 0
        sincedb_path => "/dev/null"
      }
    }
    
    filter {
      if [path] =~ "csv1" {
        csv {
          separator => ";"
          columns => ["name1", "name2", "name3", "ID"]
        }
      }
    }
    
    output {
      if [path] =~ "csv1" {
        elasticsearch {
          hosts => "localhost"
          index => "my_index"
          document_id => "%{ID}"
        }
      }
    }
    

    然后使用以下命令创建弹性搜索索引:

    PUT /my_index/
    {
      "mappings": {
        "doc": {
          "properties": {
            "name1": {
              "type": "text",
              "copy_to": "searchfield" 
            },
            "name2": {
              "type": "text",
              "copy_to": "searchfield" 
            },
            "name3": {
              "type": "text",
              "copy_to": "searchfield" 
            },
            "searchfield": {
              "type": "text"
            }
          }
        }
      }
    }
    

    然后您可以按如下方式运行搜索:

    GET /my_index/_search
    {
      "query": {
        "match": {
          "searchfield": {
            "query": "your text"
          }
        }
      }
    }
    

    【讨论】:

    • 首先感谢您的回答。第二种解决方案似乎更适合我的情况。但是,我在弹性搜索方面还没有太多经验,所以可能是一个愚蠢的问题。在配置文件中,我在哪里使用copy_to 定义映射?现在我们只是用 csv 列创建映射。所以基本上我必须在哪里放置你的映射 sn-p ? (将更新我的示例配置以便更好地理解)
    • copy_to 片段仅存在于 Elasticsearch 结构中用于搜索目的,它不作为源字段存在,Logstash 不必对此一无所知。 Logstash 告诉索引什么,Elasticsearch 知道如何索引它。 :) 寻找管理 Elasticsearch 索引结构的方法。
    • 好的,这很有帮助。谢谢你的四位解释。 :)
    • 另外,如果您采用第二种方法,您不再需要创建 searchfield 并且该部分可以从您的 Logstash 配置文件中排除 :)
    • @JohnnyKonfetti 我还添加了一个更好的示例,说明您的配置应该如何基于您的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多