弹性搜索 GeoIp 位置不是 geo_point 类型

Elastic Search GeoIp location not of type geo_point

我是 运行 ElasticSearch、Logstash 和 Kibana 使用 Docker Compose 基于解决方案:https://github.com/deviantony/docker-elk.

我正在按照本教程尝试在处理我的网络日志时添加 geoip 信息:https://www.elastic.co/blog/geoip-in-the-elastic-stack

在 logstash 中,我正在处理来自 FileBeat 的文件,并且我已将 geoip 添加到我的过滤器中:

filter {
    ...

    geoip {
      source => "client_ip"
    }
}

当我在 Kibana 中查看文档时,它们确实包含其他信息,例如 geoip.country_namegeoip.city_name 等,但我希望 geoip.location 字段的类型为 geo_point我的索引。

下面是一些 geoip 字段映射方式的示例:

而不是 geo_point 我看到 location.latlocation.lon。为什么我的位置不是 geo_point 类型?我需要某种映射等吗?

ingest-commoningest-geoipingest-user-agentx-pack 都会在 ElasticSearch 启动时加载。我已经在 Kibana 中刷新了索引的字段列表。

编辑 1:

根据@Val 的回答,我正在尝试更改索引的映射:

PUT iis-log-*/_mapping/log
{
  "properties": {
    "geoip": {
      "dynamic": true,
      "properties": {
        "ip": {
          "type": "ip"
        },
        "location": {
          "type": "geo_point"
        },
        "latitude": {
          "type": "half_float"
        },
        "longitude": {
          "type": "half_float"
        }
      }
    }
  }
}

但这给了我这个错误:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "mapper [geoip.ip] of different type, current_type [text], merged_type [ip]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "mapper [geoip.ip] of different type, current_type [text], merged_type [ip]"
  },
  "status": 400
}

在您提到的 article 中,他们确实解释了您需要在 "Mapping, for Maps" 部分中为 geo_point 字段放置一个特定的映射。

如果您使用默认索引名称(即 logstash-*)和默认映射类型(即 log),那么 Logstash 会为您处理映射。但如果没有,您需要使用以下方法自行安装:

PUT your_index
{
  "mappings" : {
    "_default_" : {
      "_all" : {"enabled" : true, "norms" : false},
      "dynamic_templates" : [ {
        "message_field" : {
          "path_match" : "message",
          "match_mapping_type" : "string",
          "mapping" : {
            "type" : "text",
            "norms" : false
          }
        }
      }, {
        "string_fields" : {
          "match" : "*",
          "match_mapping_type" : "string",
          "mapping" : {
            "type" : "text", "norms" : false,
            "fields" : {
              "keyword" : { "type": "keyword", "ignore_above": 256 }
            }
          }
        }
      } ],
      "properties" : {
        "@timestamp": { "type": "date", "include_in_all": false },
        "@version": { "type": "keyword", "include_in_all": false },
        "geoip"  : {
          "dynamic": true,
          "properties" : {
            "ip": { "type": "ip" },
            "location" : { "type" : "geo_point" },
            "latitude" : { "type" : "half_float" },
            "longitude" : { "type" : "half_float" }
          }
        }
      }
    }
  }
}

在上面的映射中,您看到 geoip.location 字段被视为 geo_point