35

在我的系统中,数据的插入总是通过 csv 文件通过 logstash 完成。我从不预先定义映射。但是每当我输入一个字符串时,它总是被认为是analyzed,因此一个条目就像hello I am Sinha被拆分为hello, I, am, Sinha。无论如何我可以更改弹性搜索的默认/动态映射,以便所有字符串,无论索引,无论类型如何都被视为not analyzed?或者有没有办法在.conf文件中设置它?说我的conf文件看起来像

input {  
      file {
          path => "/home/sagnik/work/logstash-1.4.2/bin/promosms_dec15.csv"
          type => "promosms_dec15"
          start_position => "beginning"
          sincedb_path => "/dev/null"
      }
}
filter {

    csv {
        columns => ["Comm_Plan","Queue_Booking","Order_Reference","Multi_Ordertype"]
        separator => ","
    }  
    ruby {
          code => "event['Generation_Date'] = Date.parse(event['Generation_Date']);"
    }

}
output {  
    elasticsearch { 
        action => "index"
        host => "localhost"
        index => "promosms-%{+dd.MM.YYYY}"
        workers => 1
    }
}

我希望所有的字符串都是not analyzed,我不介意它是所有未来数据插入弹性搜索的默认设置

4

4 回答 4

28

只需创建一个模板。跑

curl -XPUT localhost:9200/_template/template_1 -d '{
    "template": "*",
    "settings": {
        "index.refresh_interval": "5s"
    },
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": true
            },
            "dynamic_templates": [
                {
                    "string_fields": {
                        "match": "*",
                        "match_mapping_type": "string",
                        "mapping": {
                            "index": "not_analyzed",
                            "omit_norms": true,
                            "type": "string"
                        }
                    }
                }
            ],
            "properties": {
                "@version": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "geoip": {
                    "type": "object",
                    "dynamic": true,
                    "path": "full",
                    "properties": {
                        "location": {
                            "type": "geo_point"
                        }
                    }
                }
            }
        }
    }
}'
于 2014-12-16T10:06:14.107 回答
20

您可以查询.raw字段的版本。这是在Logstash 1.3.1中添加的:

我们提供的 logstash 索引模板为您索引的每个字段添加了一个“.raw”字段。这些“.raw”字段由 logstash 设置为“not_analyzed”,因此不会进行分析或标记化——我们的原始值按原样使用!

因此,如果您的字段被调用foo,您将查询foo.raw返回not_analyzed(不拆分分隔符)版本。

于 2015-02-24T15:00:35.033 回答
13

从您的 Logstash 发行版(可能安装为 /opt/logstash/lib/logstash/outputs/elasticsearch/elasticsearch-template.json)复制 lib/logstash/outputs/elasticsearch/elasticsearch-template.json,通过替换来修改它

"dynamic_templates" : [ {
  "string_fields" : {
    "match" : "*",
    "match_mapping_type" : "string",
    "mapping" : {
      "type" : "string", "index" : "analyzed", "omit_norms" : true,
      "fields" : {
        "raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256}
      }
    }
  }
} ],

"dynamic_templates" : [ {
  "string_fields" : {
    "match" : "*",
    "match_mapping_type" : "string",
    "mapping" : {
      "type" : "string", "index" : "not_analyzed", "omit_norms" : true
    }
  }
} ],

template为您将输出插件指向修改后的文件:

output {
  elasticsearch {
    ...
    template => "/path/to/my-elasticsearch-template.json"
  }
}

您仍然可以为特定字段覆盖此默认值。

于 2014-12-15T13:02:22.653 回答
1

我认为更新映射只是为了报告目的而处理字段的错误方法。迟早您可能希望能够在该字段中搜索令牌。如果您将字段更新为“not_analyzed”并希望从值“foo bar”中搜索 foo,您将无法执行此操作。

更优雅的解决方案是使用 kibana 聚合过滤器而不是术语。类似下面的内容将搜索词 ivr04 和 ivr02。所以在你的情况下,你可以有一个过滤器“你好,我是辛哈”。希望这可以帮助。

在此处输入图像描述

于 2016-11-01T10:54:02.027 回答