弹性搜索 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_name
、geoip.city_name
等,但我希望 geoip.location
字段的类型为 geo_point
我的索引。
下面是一些 geoip 字段映射方式的示例:
而不是 geo_point
我看到 location.lat
和 location.lon
。为什么我的位置不是 geo_point
类型?我需要某种映射等吗?
ingest-common
、ingest-geoip
、ingest-user-agent
和 x-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
。
我是 运行 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_name
、geoip.city_name
等,但我希望 geoip.location
字段的类型为 geo_point
我的索引。
下面是一些 geoip 字段映射方式的示例:
而不是 geo_point
我看到 location.lat
和 location.lon
。为什么我的位置不是 geo_point
类型?我需要某种映射等吗?
ingest-common
、ingest-geoip
、ingest-user-agent
和 x-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
。