elasticsearch Logstash csv导入-如果不为空,则对添加_字段进行修改
我正在使用logstash将csv文件中的数据导入elasticsearch 在导入过程中,我希望创建一个新字段,该字段包含来自其他两个字段的值。以下是我导入的一个片段:
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
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我还添加了一个更好的示例,根据您的更新,您的配置应该是什么样子。