Logstash保持,尽管被停用

问题描述:

我定义我自己的模板,通过logstash在那里我有禁用动态映射使用的dynamic_mapping创建领域:Logstash保持,尽管被停用

{ 
    "my_index": { 
     "order": 0, 
     "template": "my_index", 
     "settings": { 
      "index": { 
       "mapper": { 
        "dynamic": "false" 
       }, 
       "analysis": { 
        "analyzer": { 
         "nlp_analyzer": { 
          "filter": [ 
           "lowercase" 
          ], 
          "type": "custom", 
          "tokenizer": "nlp_tokenizer" 
         } 
        }, 
        "tokenizer": { 
         "nlp_tokenizer": { 
          "pattern": "" 
          "(\w+)|(\s*[\s+])" 
          "", 
          "type": "pattern" 
         } 
        } 
       }, 
       "number_of_shards": "1", 
       "number_of_replicas": "0" 
      } 
     }, 
     "mappings": { 
      "author": { 
       "properties": { 
        "author_name": { 
         "type": "keyword" 
        }, 
        "author_pseudo": { 
         "type": "keyword" 
        }, 
        "author_location": { 
         "type": "text", 
         "fields": { 
          "standard": { 
           "analyzer": "standard", 
           "term_vector": "yes", 
           "type": "text" 
          }, 
          "nlp": { 
           "analyzer": "nlp_analyzer", 
           "term_vector": "yes", 
           "type": "text" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

为了测试是否elasticsearch不会产生新的领域我尝试让我在事件现场是不存在于我的映射,让我们说,我有这样的事件:

{ 
“type” => “author”, 
“author_pseudo” => “chloemdelorenzo”, 
“author_name” => “Chloe DeLorenzo”, 
“author_location” => “US”, 
} 

Elasticsearch将在映射索引此事件时,产生一个新的领域

"type": { 
    "type": "text", 
     "fields": { 
      "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
      } 
     } 
} 

我知道,因为在我的映射我使用一个自定义的分析,我可以找到它放回产生的映射是Logstash使用我的模板。但显然它没有考虑到动态字段被禁用。

我想elasticsearch忽略不存在在我的映射,但以指数有定义的映射场域。我如何避免logstash创建新的字段?

你应该强制在文档类型级别的映射。无论此设置的值的

https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-mapping.html

,类型仍然可以创建索引或与PUT映射API明确当加入 。

所以,你的映射会是这样的:

"mappings": { 
    "author": { 
     "dynamic": false, 
     "properties": { 
      "author_name": { 
       "type": "keyword" 
      }, 
      "author_pseudo": { 
       "type": "keyword" 
      }, 
      "author_location": { 
       "type": "text", 
       "fields": { 
        "standard": { 
         "analyzer": "standard", 
         "term_vector": "yes", 
         "type": "text" 
        }, 
        "nlp": { 
         "analyzer": "nlp_analyzer", 
         "term_vector": "yes", 
         "type": "text" 
        } 
       } 
      } 
     } 
    } 
} 

这个答案是不正是您所要求的,但你可以手动删除字段与logstash过滤器是这样的:

filter { 
    mutate { 
    remove_field => ["fieldname"] 
    } 
} 

如果您的活动有一个定义的字段列表,你可以解决你的问题,这办法。

+0

是的,我知道,但我可以有很多意想不到的领域透进来的所以这是一个解决方案,我买不起 – mel

+0

怎么样'prune'过滤器?它允许您将好域名列入白名单而不是将其列入黑名单。检查https://www.elastic.co/guide/en/logstash/current/plugins-filters-prune.html – whites11

+0

我想我找到了一个解决方案,而不使用其他插件。我强制执行文档类型级别的动态映射: “...”作者“:{动}”:“false” – mel