在logstash中为新字段设置Elasticsearch Analyzer

时间:2013-12-08 14:36:00

标签: logging elasticsearch logstash

通过使用GROK filter,我们可以向Logstash添加新字段。

但是,在这里,我想知道如何为该特定领域设置分析器。

例如:,我有一个新的id字段,其字段类似a_b,但Elasticsearch提供的普通分析器会将其分为ab。因此,我无法有效地在该特定字段上应用术语功能并使其有用。

这里对于ID字段,我想应用我自己的自定义分析器,它不会对值进行标记,而是应用小写过滤器。

如何在logstash中完成此操作。

1 个答案:

答案 0 :(得分:9)

Elasticsearch中的默认分析器会使用Standard tokenizer对术语进行标记,这会将a b标记为两个术语:ab,在默认停止后 - 单词标记过滤器将变为单个术语b。有关显示文本分析方式的小例子,请参阅this play

为了按照您指定的方式进行分析,我们必须配置我们的分析器:

"analyzer": {
    "my_id_analyzer": {
        "type": "custom",
        "tokenizer": "keyword",
        "filters": ["lowercase"]
    }
}

Byt,因为Logstash通常会在需要时创建新索引,因此我们必须确保在创建索引时,此分析器可用于所有索引。有两种方法可以实现这一点:1)将其添加到Elasticsearch实例配置(elasticsearch.yml),或2)创建包含分析器的索引模板。

因为我们只需要在特定索引上使用此分析器(即前缀为logstash-的索引)。通过使用Index template API,我们可以执行以下操作:

curl localhost:9200/_template/logstash-id -XPUT -d '{
    "template": "logstash-*",
    "settings" : {
        "analysis": {
            "analyzer": {
                "my_id_analyzer": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filters": ["lowercase"]
                }
            }
        }
    },
    "mappings": {
        "_default_": {
             "properties" : {
                "id" : { "type" : "string", "analyzer" : "my_id_analyzer" }
            }
        }
    }
}'

执行上述命令后,此模板将应用于之后创建前缀为logstash-的任何索引,唯一的“魔术”部分是添加的映射定义,该定义使用内置类型{{ 1}},它是给定索引中“any”类型的占位符。这意味着映射将添加到任何类型,而不管其实际类型名称。