Elasticsearch:没有在字段 [hostname] 上声明的类型 [keyword] 的处理程序

Posted

技术标签:

【中文标题】Elasticsearch:没有在字段 [hostname] 上声明的类型 [keyword] 的处理程序【英文标题】:Elasticsearch: No handler for type [keyword] declared on field [hostname] 【发布时间】:2016-10-02 15:16:39 【问题描述】:

从 filebeat 索引日志时,我在 Elasticsearch 上遇到 Mapper Parsing Error。

我尝试了 Filebeat -> Elasticserach 和 Filebeat -> Logstash -> Elasticsearch 方法。

我按照他们自己的文档,按照Loading the Index Template in Elasticsearch | Filebeat Reference的指示和验证安装了filebeat模板

我的 elasticsearch 通常可以与我的其他数据索引一起正常工作,我在 Kibana 上对其进行了测试。它是官方的 docker Docker Hub | Elasticsearch 安装。

谷歌搜索了很多,没有任何运气,因此,感谢任何帮助。

更新 1:

ES 版本:2.3.3(我相信是最新的)

模板文件是 filebeat 附带的默认文件。


  "mappings": 
    "_default_": 
      "_all": 
        "norms": false
      ,
      "dynamic_templates": [
        
          "fields": 
            "mapping": 
              "ignore_above": 1024,
              "type": "keyword"
            ,
            "match_mapping_type": "string",
            "path_match": "fields.*"
          
        
      ],
      "properties": 
        "@timestamp": 
          "type": "date"
        ,
        "beat": 
          "properties": 
            "hostname": 
              "ignore_above": 1024,
              "type": "keyword"
            ,
            "name": 
              "ignore_above": 1024,
              "type": "keyword"
            
          
        ,
        "input_type": 
          "ignore_above": 1024,
          "type": "keyword"
        ,
        "message": 
          "norms": false,
          "type": "text"
        ,
        "offset": 
          "type": "long"
        ,
        "source": 
          "ignore_above": 1024,
          "type": "keyword"
        ,
        "type": 
          "ignore_above": 1024,
          "type": "keyword"
        
      
    
  ,
  "order": 0,
  "settings": 
    "index.refresh_interval": "5s"
  ,
  "template": "filebeat-*"

更新 2: 你是对的,看看

#/usr/share/filebeat/bin/filebeat --version filebeat version 5.0.0-alpha2 (amd64), libbeat 5.0.0-alpha2

虽然这是将 apache 日志发布到 logstash。但是我无法以正确的格式获取此 vhost_combined 日志

sub1.example.com:443 1.9.202.41 - - [03/Jun/2016:06:58:17 +0000] "GET /notifications/pendingCount HTTP/1.1" 200 591 0 32165 "https://sub1.example.com/path/index?var=871190" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/50.0.2661.102 Safari/537.36"

"message" => "%HOSTNAME:vhost\:%NUMBER:port %COMBINEDAPACHELOG"

【问题讨论】:

keyword 是 ES 5 中的 new data type,但在 ES 2 中尚不支持。您拥有哪个版本的 ES,您的 filebeat 模板是什么样的? 为您添加了模板和版本信息。 @Val 【参考方案1】:

您不能将"type": "keyword" 与 ES 2.3.3 一起使用,因为这是 ES 5 中的新数据类型(目前在 alpha3 中)

你需要用

替换所有这些出现
"type": "string",
"index": "not_analyzed"

您需要改用filebeat.template-es2x.json

【讨论】:

我已经从您的上一条评论中发现了这一点,现在 ES 上的情况正在好转。 Filebeat 官方文档应该提到这个非常关键的信息,因为 ES 2.3.3 仍然是文档中的官方版本。 你有哪个版本的filebeat,你是怎么安装的?我有最新的,即1.2.3 and the filebeat-template.json file 与 ES 2.3.3 完美配合,即其中没有 "type": "keyword" 我从他们的官方文档中安装了 filebeat。他们在 /etc/filebeat/ 目录中提供了上面提到的 es2 模板和 filebeat.template.json。我刚刚删除了旧模板并放入了新模板。此版本没有 type 关键字。 你能确认你安装的是 Filebeat 1.2 而不是 Filebeat 5.0 吗?根据您使用的版本,他们有不同版本的文档。现在官方的包是here,并且有一个没有“关键字”的模板文件。 请随时就这个新的特定问题发布另一个问题。

以上是关于Elasticsearch:没有在字段 [hostname] 上声明的类型 [keyword] 的处理程序的主要内容,如果未能解决你的问题,请参考以下文章

nodejs中的Elasticsearch连接时没有活动连接错误

为啥 ElasticSearch 没有找到我的术语

ElasticSearch:在禁用 Groovy 的 _score 字段上进行聚合

如何在elasticsearch的嵌套聚合中存储空字段和非空字段?

没有脚本编译速率限制的多个文档上的 Python ElasticSearch 更新字段

Elasticsearch 有没有比 reindex 更轻量级的更换字段类型的方式?