如何在Logstash上定义特定的字段标记化

时间:2016-09-22 11:57:31

标签: elasticsearch logstash tokenize

我使用logstash索引elasticsearch上的一些mysql数据:

input {
    jdbc {
      // JDBC configurations
    }
}
output {
    elasticsearch {
        index => ""
        document_type => ""
        document_id => ""
        hosts => [ "" ]
    }
}

检查结果时,我发现elasticsearch会自动将文本标记为:

"Foo/Bar" -> "Foo", "Bar"
"The thing" -> "The", "thing"
"Fork, Knife" -> "Fork", "Knife"

嗯,这对我的大部分领域来说都没问题。但是我有一个特定的领域,我希望有一个自定义标记器。它是逗号分隔的字段(或分号分隔)。所以它应该是:

"Foo/Bar" -> "Foo/Bar"
"The thing" -> "The thing"
"Fork, Knife" -> "Fork", "Knife"

如果有办法在我的logstash配置中配置它,我会徘徊。

更新

这是我拥有的索引的一个例子。具体字段为kind

{
  "index-name": {
    "aliases": {},
    "mappings": {
      "My-type": {
        "properties": {
          "@timestamp": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
          "@version": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "id": {
            "type": "long"
          },
          "text": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "",
        "number_of_shards": "",
        "number_of_replicas": "",
        "uuid": "",
        "version": {
          "created": ""
        }
      }
    },
    "warmers": {}
  }
} 

2 个答案:

答案 0 :(得分:2)

可以使用index template来完成此操作。

首先删除当前索引:

AVPlayerLayer

然后使用DELETE index_name 字段的相应映射为您的索引创建模板,如下所示:

kind

然后,您可以再次运行Logstash,并使用正确的映射重新创建索引。

答案 1 :(得分:0)

嗯,这个问题的正确答案是:你不能通过logstash来做到这一点。所以我不得不再添加一个步骤。

我终于按照@Val显示的路径完成了这项工作。谢谢,伙计。因此,我必须做的是在logstash ETL之前使用特定的标记化器创建索引:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "simple_analyzer": {
          "tokenizer": "simple_tokenizer"
        }
      },
      "tokenizer": {
        "simple_tokenizer": {
          "type": "pattern",
          "pattern": ","
        }
      }
    }
  },
  "template": "my-index",
  "mappings": {
    "my-type": {
      "properties": {
        "kind": {
          "type": "string",
          "analyzer": "simple_analyzer"
        }
      }
    }
  }
}

这将通过逗号为kind字段创建一个tokenizer。之后,我可以执行logstash etl,它不会覆盖kind属性。