概述
geoip 处理器根据来自 Maxmind 数据库的数据添加有关IP地址地理位置的信息。 默认情况下,该处理器将此信息添加到 geoip 字段下。 geoip 处理器可以解析 IPv4 和 IPv6 地址。
默认情况下,ingest-geoip 模块与 Maxmind 的 GeoLite2 城市,GeoLite2 国家/地区和 GeoLite2 ASN geoip2 数据库一起提供,可根据 CCA-ShareAlike 4.0 许可使用。 有关更多详细信息,请参见 http://dev.maxmind.com/geoip/geoip2/geolite2/
geoip 处理器可以与 Maxmind 的其他 GeoIP2 数据库一起运行。 必须将文件复制到 ingest-geoip 配置目录中,并且 database_file 选项应用于指定自定义数据库的文件名。 自定义数据库文件必须未压缩存储。 ingest-geoip 配置目录位于 $ES_CONFIG/ingest-geoip。
我们先来使用几个简单的例子来展示如何使用 geoip 这个处理器。
这是一个使用默认城市数据库并将地理信息添加到基于 ip 字段的 geoip 字段的示例:
PUT _ingest/pipeline/geoip
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip"
}
}
]
}
PUT my_index/_doc/my_id?pipeline=geoip
{
"ip": "8.8.8.8"
}
GET my_index/_doc/my_id
我们知道上面的 IP 地址是一个很著名的 DNS 解析服务器地址。在上面,我们使用了 geoip 处理器来对ip这个字段进行丰富。上面的返回结果是:
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "my_id",
"_version" : 4,
"_seq_no" : 5,
"_primary_term" : 9,
"found" : true,
"_source" : {
"geoip" : {
"continent_name" : "North America",
"country_iso_code" : "US",
"location" : {
"lon" : -97.822,
"lat" : 37.751
}
},
"ip" : "8.8.8.8"
}
}
上面返回的字段,除了原有的 ip 字段外, 我们同时也看到了一个新增加的字段 geoip。这个字段是原始字段完全没有的,但是经过 geoip 处理器处理后,就增加了很多有用的信息,比如 continent_name, country_iso_code 及 location 字段。我们可以知道这个服务器的地址位置,比如经纬度信息。这些信息在使用地图应用,并把数据显示在地图上非常有用。
这是一个使用默认国家/地区数据库,并根据ip字段将地理信息添加到 geo 字段的示例。 请注意,此数据库包含在模块中。 所以这:
PUT _ingest/pipeline/geoip
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip",
"target_field" : "geo",
"database_file" : "GeoLite2-Country.mmdb"
}
}
]
}
PUT my_index/_doc/my_id?pipeline=geoip
{
"ip": "8.8.8.8"
}
GET my_index/_doc/my_id
返回:
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "my_id",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"geo" : {
"continent_name" : "North America",
"country_iso_code" : "US",
"country_name" : "United States"
},
"ip" : "8.8.8.8"
}
}
但是并不是所有的 IP 地址都可以在数据库中找到地理信息。在这种情况下,没有 target_field 被插入到文档中。在这里特别指明一下: target_field 在默认的情况下是 geoip 字段,比如在上面的调用中,我们指明是 geo。
我们可以使用 database 来选择另外一个 database,比如:
PUT _ingest/pipeline/geoip
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip",
"target_field" : "geo",
"database_file" : "GeoLite2-ASN.mmdb"
}
}
]
}
在上面,我选择使用 GeoLite2-ASN.mmdb 来作为 database_file,那么当我们使用同样的命令来导入数据时:
PUT my_index/_doc/my_id?pipeline=geoip
{
"ip": "8.8.8.8"
}
我们可以看到如下的信息:
GET my_index/_doc/my_id
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "my_id",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"geo" : {
"ip" : "8.8.8.8",
"organization_name" : "Google LLC",
"asn" : 15169,
"network" : "8.8.8.0/24"
},
"ip" : "8.8.8.8"
}
}
我们可以看到 organization_name 是来自 Google。
这是当找不到 “80.231.5.0” 的信息时,文档被导入后的展示:
PUT _ingest/pipeline/geoip
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip"
}
}
]
}
PUT my_index/_doc/my_id?pipeline=geoip
{
"ip": "80.231.5.0"
}
GET my_index/_doc/my_id
上面查询的结果是:
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "my_id",
"_version" : 6,
"_seq_no" : 7,
"_primary_term" : 9,
"found" : true,
"_source" : {
"ip" : "80.231.5.0"
}
}
由于 IP 地址 80.231.5.0 在数据库中并不存在,那么最终在文档中没有添加任何的字段。
在数据被导入到 Elasticsearch 中时,尽管此处理器使用包含IP地址的估计纬度和经度的位置字段来丰富你的文档,但是如果未在映射中明确定义该字段,则该字段在 Elasticsearch中不会被索引为 geo_point 类型。
你可以对上面的示例索引使用以下映射:
PUT my_ip_locations
{
"mappings": {
"properties": {
"geoip": {
"properties": {
"location": { "type": "geo_point" }
}
}
}
}
}
更多阅读:Elasticsearch:如何解决 Elasticsearch Geoip 处理器故障。
最后
以上就是独特鞋子为你收集整理的Elasticsearch:运用 geoip 处理器来丰富数据的全部内容,希望文章能够帮你解决Elasticsearch:运用 geoip 处理器来丰富数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复