Elasticsearch:运用 geoip 处理器来丰富数据

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" : 5,
  "_seq_no" : 6,
  "_primary_term" : 9,
  "found" : true,
  "_source" : {
    "geo" : {
      "continent_name" : "North America",
      "country_iso_code" : "US"
    },
    "ip" : "8.8.8.8"
  }
}

但是并不是所有的IP地址都可以在数据库中找到地理信息。在这种情况下,没有 target_field 被插入到文档中。在这里特别指明一下: target_field 在默认的情况下是 geoip 字段,比如在上面的调用中,我们指明是geo。

这是当找不到“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" }
        }
      }
    }
  }
}