【问题标题】:How to deduplicate documents while indexing into elasticsearch from logstash如何在从logstash索引到elasticsearch时对文档进行重复数据删除
【发布时间】:2014-07-30 12:49:17
【问题描述】:

我将 Logstash 1.4.1 与 ES1.01 一起使用,并希望根据计算得出的校验和替换已编入索引的文档。我目前正在使用 Logstash 中的“指纹”过滤器,它根据指定的算法创建一个“指纹”字段。现在 - 我想要完成的是 ES 根据相同的指纹值替换已经存在的文档。

例如,我有一个指纹字段值为“2c9a6802e10fbcff36177e0b88993f90868fa6fa”的文档。现在 - 如果一个具有相同指纹值的文档即将被索引,我希望它替换索引中已经存在的 old 文档。

我尝试将以下内容添加到我假设 Logstash ES 输出插件使用的“elasticsearch-template.json”模板文件中:

...
  "mappings" : {
    "_default_" : {
       "_id" : {"index": "not_analyzed", "store" : false, "path" : "fingerprint" },
       "_all" : {"enabled" : true},
       "dynamic_templates" : [ {
...

但它不起作用。我在这里做错了什么?

干杯

【问题讨论】:

    标签: elasticsearch logstash


    【解决方案1】:

    我会在您的 logstash elasticsearch 输出部分中使用 document_id 参数:

    document_id

    Value type is string
    Default value is nil
    

    索引的文档 ID。用于覆盖现有条目 在 Elasticsearch 中使用相同的 ID。

    https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-document_id

    我认为条目应该是这样的:

    document_id => "%{fingerprint}"
    

    它使用logstash的sprintf格式将字符串替换为字段的内容:

    https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html#sprintf

    【讨论】:

    • 效果很好!谢谢:)
    【解决方案2】:

    假设指纹被设置为 _id,您可能会遇到 logstash 的日常索引管理问题,而不是使用数据中的时间戳。

    确保您从输入数据中设置了时间戳,从而保证文档进入正确的每日索引:

    http://logstash.net/docs/1.4.2/filters/date

    如果我的猜测是正确的,您应该会看到您的重复文档具有不同的@timestamp 并且位于不同的每日索引中。

    【讨论】:

    • 嗨!嗯,我认为这不是问题。时间戳设置正确,但不知何故,“_id”字段未设置为“指纹”字段中存在的值。我想通过修改logstash / es模板文件,我可以将“_id”字段的“path”属性设置为“fingerprint”,但到目前为止我无法完成这项工作......不过感谢您的建议:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多