elasticsearch Logstash csv导入-如果不为空,则对添加_字段进行修改,elasticsearch,logstash,csv-import,elasticsearch,Logstash,Csv Import" /> elasticsearch Logstash csv导入-如果不为空,则对添加_字段进行修改,elasticsearch,logstash,csv-import,elasticsearch,Logstash,Csv Import" />

elasticsearch Logstash csv导入-如果不为空,则对添加_字段进行修改

elasticsearch Logstash csv导入-如果不为空,则对添加_字段进行修改,elasticsearch,logstash,csv-import,elasticsearch,Logstash,Csv Import,我正在使用logstash将csv文件中的数据导入elasticsearch 在导入过程中,我希望创建一个新字段,该字段包含来自其他两个字段的值。以下是我导入的一个片段: input { file { path => "/data/xyz/*.csv" start_position => "beginning" ignore_older => 0 sinc

我正在使用logstash将csv文件中的数据导入elasticsearch

在导入过程中,我希望创建一个新字段,该字段包含来自其他两个字段的值。以下是我导入的一个片段:

    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}
写入新字段。有没有办法只在值不为空的情况下添加值?

我认为除了检查
name3
是否存在之外,没有别的办法了,基于此,构建搜索字段

if[name3]{
变异{
id=>“带-name3”
add_field=>{“searchfield”=>“%{name1}%{name2}%{name3}”
}
}否则{
变异{
id=>“不带-name3”
add_field=>{“searchfield”=>“%{name1}%{name2}”
}
}
或者,如果我正确理解您的问题,您显然希望将此数据发送到Elasticsearch,并希望有一个可搜索的字段。为了避免源代码中的数据重复,可以使用
copy\u to
语句构建搜索字段。您的映射如下所示:

{
“映射”:{
“文件”:{
“财产”:{
“名称1”:{
“类型”:“文本”,
“复制到”:“搜索字段”
},
“名称2”:{
“类型”:“文本”,
“复制到”:“搜索字段”
},
“名称3”:{
“类型”:“文本”,
“复制到”:“搜索字段”
},
“搜索字段”:{
“类型”:“文本”
}
}
}
}
}
然后,您可以完美地对该字段运行查询,而不会在源代码中出现重复项

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

输入{
文件{
path=>“/data/xyz/*.csv”
开始位置=>“开始”
忽略\u older=>0
sincedb_path=>“/dev/null”
}
}
滤器{
如果[路径]=“csv1”{
csv{
分隔符=>“;”
列=>[“名称1”、“名称2”、“名称3”、“ID”]
}
}
}
输出{
如果[路径]=“csv1”{
弹性搜索{
主机=>“本地主机”
索引=>“我的索引”
文档id=>“%{id}”
}
}
}
然后使用以下命令创建elasticsearch索引:

PUT/my\u索引/
{
“映射”:{
“文件”:{
“财产”:{
“名称1”:{
“类型”:“文本”,
“复制到”:“搜索字段”
},
“名称2”:{
“类型”:“文本”,
“复制到”:“搜索字段”
},
“名称3”:{
“类型”:“文本”,
“复制到”:“搜索字段”
},
“搜索字段”:{
“类型”:“文本”
}
}
}
}
}
然后可以按如下方式运行搜索:

GET/my\u index/\u搜索
{
“查询”:{
“匹配”:{
“搜索字段”:{
“查询”:“您的文本”
}
}
}
}

首先感谢您的回答。第二种解决方案似乎更适合我的情况。不过,我在elasticsearch方面还没有太多经验,所以这可能是一个愚蠢的问题。在配置文件中,我在哪里使用
copy\u to
定义映射?现在我们只是用csv列创建映射。那么基本上我应该把你的映射片段放在哪里呢?(将更新我的示例配置以便更好地理解)
copy_to
fragment仅存在于Elasticsearch结构中,用于搜索目的,它不作为源字段存在,Logstash也不需要知道任何有关它的信息
Logstash
告诉索引内容,
Elasticsearch
知道如何索引它。:)寻找管理Elasticsearch索引结构的方法。好的,这很有帮助。谢谢你的四个解释。:)另外,如果您采用第二种方法,您不再需要创建
搜索字段
,并且该部分可以从您的日志存储配置文件中排除:)@JohnnyKonfetti我还添加了一个更好的示例,根据您的更新,您的配置应该是什么样子。