IP 地址位置处理器

编辑

ip_location 处理器会添加有关 IPv4 或 IPv6 地址的地理位置信息。

默认情况下,处理器使用来自 MaxMind 的 GeoLite2 City、GeoLite2 Country 和 GeoLite2 ASN IP 地理位置数据库,这些数据库以 CC BY-SA 4.0 许可共享。如果您的节点可以连接到 storage.googleapis.com 域,并且满足以下任一条件,则会自动下载这些数据库:

  • ingest.geoip.downloader.eager.download 设置为 true
  • 您的集群至少有一个带有 geoipip_location 处理器的管道

Elasticsearch 会自动从 Elastic GeoIP 端点下载这些数据库的更新:https://geoip.elastic.co/v1/database。要获取这些更新的下载统计信息,请使用 GeoIP 统计 API

如果您的集群无法连接到 Elastic GeoIP 端点,或者您想管理自己的更新,请参阅 管理您自己的 IP 地理位置数据库更新

如果您希望 Elasticsearch 使用您自己提供的许可证密钥直接从 Maxmind 下载数据库文件,请参阅 创建或更新 IP 地理位置数据库配置

如果 Elasticsearch 无法连接到端点 30 天,则所有更新的数据库都将失效。Elasticsearch 将停止使用 IP 地理位置数据丰富文档,并改为添加 tags: ["_ip_location_expired_database"] 字段。

在管道中使用 ip_location 处理器

编辑

表 28. ip-location 选项

名称 必需 默认值 描述

field

-

从中获取 IP 地址以进行地理位置查找的字段。

target_field

ip_location

将保存从数据库中查找的地理信息的字段。

database_file

GeoLite2-City.mmdb

数据库文件名,指的是自动下载的 GeoLite2 数据库之一(GeoLite2-City.mmdb、GeoLite2-Country.mmdb 或 GeoLite2-ASN.mmdb),或者 ingest-geoip 配置目录中支持的数据库文件的名称,或者是配置的数据库的名称(附加了 .mmdb 后缀)。

properties

[continent_name, country_iso_code, country_name, region_iso_code, region_name, city_name, location] *

控制根据 IP 地理位置查找将哪些属性添加到 target_field

ignore_missing

如果 truefield 不存在,则处理器将静默退出,而不修改文档

first_only

true

如果 true,则仅返回找到的第一个 IP 地理位置数据,即使 field 包含数组

download_database_on_pipeline_creation

true

如果 true(并且如果 ingest.geoip.downloader.eager.downloadfalse),则在创建管道时下载缺少的数据库。否则,当管道用作索引中的 default_pipelinefinal_pipeline 时,会触发下载。

*取决于 database_file 中可用的内容

  • 如果使用 GeoLite2 City 或 GeoIP2 City 数据库,则可以在 target_field 下添加以下字段:ipcountry_iso_codecountry_namecountry_in_european_unionregistered_country_iso_coderegistered_country_nameregistered_country_in_european_unioncontinent_codecontinent_nameregion_iso_coderegion_namecity_namepostal_codetimezonelocationaccuracy_radius。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。
  • 如果使用 GeoLite2 Country 或 GeoIP2 Country 数据库,则可以在 target_field 下添加以下字段:ipcountry_iso_codecountry_namecountry_in_european_unionregistered_country_iso_coderegistered_country_nameregistered_country_in_european_unioncontinent_codecontinent_name。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。
  • 如果使用 GeoLite2 ASN 数据库,则可以在 target_field 下添加以下字段:ipasnorganization_namenetwork。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。
  • 如果使用 GeoIP2 Anonymous IP 数据库,则可以在 target_field 下添加以下字段:iphosting_providertor_exit_nodeanonymous_vpnanonymouspublic_proxyresidential_proxy。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。
  • 如果使用 GeoIP2 Connection Type 数据库,则可以在 target_field 下添加以下字段:ipconnection_type。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。
  • 如果使用 GeoIP2 Domain 数据库,则可以在 target_field 下添加以下字段:ipdomain。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。
  • 如果使用 GeoIP2 ISP 数据库,则可以在 target_field 下添加以下字段:ipasnorganization_namenetworkispisp_organization_namemobile_country_codemobile_network_code。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。
  • 如果使用 GeoIP2 Enterprise 数据库,则可以在 target_field 下添加以下字段:ipcountry_iso_codecountry_namecountry_in_european_unionregistered_country_iso_coderegistered_country_nameregistered_country_in_european_unioncontinent_codecontinent_nameregion_iso_coderegion_namecity_namepostal_codetimezonelocationaccuracy_radiuscountry_confidencecity_confidencepostal_confidenceasnorganization_namenetworkhosting_providertor_exit_nodeanonymous_vpnanonymouspublic_proxyresidential_proxydomainispisp_organization_namemobile_country_codemobile_network_codeuser_typeconnection_type。实际添加的字段取决于已找到的内容以及在 properties 中配置的属性。

这是一个示例,该示例使用默认城市数据库,并根据 ip 字段将地理信息添加到 ip_location 字段

resp = client.ingest.put_pipeline(
    id="ip_location",
    description="Add ip geolocation info",
    processors=[
        {
            "ip_location": {
                "field": "ip"
            }
        }
    ],
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="my_id",
    pipeline="ip_location",
    document={
        "ip": "89.160.20.128"
    },
)
print(resp1)

resp2 = client.get(
    index="my-index-000001",
    id="my_id",
)
print(resp2)
const response = await client.ingest.putPipeline({
  id: "ip_location",
  description: "Add ip geolocation info",
  processors: [
    {
      ip_location: {
        field: "ip",
      },
    },
  ],
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: "my_id",
  pipeline: "ip_location",
  document: {
    ip: "89.160.20.128",
  },
});
console.log(response1);

const response2 = await client.get({
  index: "my-index-000001",
  id: "my_id",
});
console.log(response2);
PUT _ingest/pipeline/ip_location
{
  "description" : "Add ip geolocation info",
  "processors" : [
    {
      "ip_location" : {
        "field" : "ip"
      }
    }
  ]
}
PUT my-index-000001/_doc/my_id?pipeline=ip_location
{
  "ip": "89.160.20.128"
}
GET my-index-000001/_doc/my_id

这将返回

{
  "found": true,
  "_index": "my-index-000001",
  "_id": "my_id",
  "_version": 1,
  "_seq_no": 55,
  "_primary_term": 1,
  "_source": {
    "ip": "89.160.20.128",
    "ip_location": {
      "continent_name": "Europe",
      "country_name": "Sweden",
      "country_iso_code": "SE",
      "city_name" : "Linköping",
      "region_iso_code" : "SE-E",
      "region_name" : "Östergötland County",
      "location": { "lat": 58.4167, "lon": 15.6167 }
    }
  }
}

这是一个示例,该示例使用默认国家/地区数据库,并根据 ip 字段将地理信息添加到 geo 字段。请注意,此数据库会自动下载。所以这个

resp = client.ingest.put_pipeline(
    id="ip_location",
    description="Add ip geolocation info",
    processors=[
        {
            "ip_location": {
                "field": "ip",
                "target_field": "geo",
                "database_file": "GeoLite2-Country.mmdb"
            }
        }
    ],
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="my_id",
    pipeline="ip_location",
    document={
        "ip": "89.160.20.128"
    },
)
print(resp1)

resp2 = client.get(
    index="my-index-000001",
    id="my_id",
)
print(resp2)
const response = await client.ingest.putPipeline({
  id: "ip_location",
  description: "Add ip geolocation info",
  processors: [
    {
      ip_location: {
        field: "ip",
        target_field: "geo",
        database_file: "GeoLite2-Country.mmdb",
      },
    },
  ],
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: "my_id",
  pipeline: "ip_location",
  document: {
    ip: "89.160.20.128",
  },
});
console.log(response1);

const response2 = await client.get({
  index: "my-index-000001",
  id: "my_id",
});
console.log(response2);
PUT _ingest/pipeline/ip_location
{
  "description" : "Add ip geolocation info",
  "processors" : [
    {
      "ip_location" : {
        "field" : "ip",
        "target_field" : "geo",
        "database_file" : "GeoLite2-Country.mmdb"
      }
    }
  ]
}
PUT my-index-000001/_doc/my_id?pipeline=ip_location
{
  "ip": "89.160.20.128"
}
GET my-index-000001/_doc/my_id

返回此结果

{
  "found": true,
  "_index": "my-index-000001",
  "_id": "my_id",
  "_version": 1,
  "_seq_no": 65,
  "_primary_term": 1,
  "_source": {
    "ip": "89.160.20.128",
    "geo": {
      "continent_name": "Europe",
      "country_name": "Sweden",
      "country_iso_code": "SE"
    }
  }
}

并非所有 IP 地址都可以从数据库中找到地理信息。发生这种情况时,不会将 target_field 插入文档中。

以下是一个示例,说明当找不到“80.231.5.0”的信息时,文档将如何被索引

resp = client.ingest.put_pipeline(
    id="ip_location",
    description="Add ip geolocation info",
    processors=[
        {
            "ip_location": {
                "field": "ip"
            }
        }
    ],
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="my_id",
    pipeline="ip_location",
    document={
        "ip": "80.231.5.0"
    },
)
print(resp1)

resp2 = client.get(
    index="my-index-000001",
    id="my_id",
)
print(resp2)
const response = await client.ingest.putPipeline({
  id: "ip_location",
  description: "Add ip geolocation info",
  processors: [
    {
      ip_location: {
        field: "ip",
      },
    },
  ],
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: "my_id",
  pipeline: "ip_location",
  document: {
    ip: "80.231.5.0",
  },
});
console.log(response1);

const response2 = await client.get({
  index: "my-index-000001",
  id: "my_id",
});
console.log(response2);
PUT _ingest/pipeline/ip_location
{
  "description" : "Add ip geolocation info",
  "processors" : [
    {
      "ip_location" : {
        "field" : "ip"
      }
    }
  ]
}

PUT my-index-000001/_doc/my_id?pipeline=ip_location
{
  "ip": "80.231.5.0"
}

GET my-index-000001/_doc/my_id

这将返回

{
  "_index" : "my-index-000001",
  "_id" : "my_id",
  "_version" : 1,
  "_seq_no" : 71,
  "_primary_term": 1,
  "found" : true,
  "_source" : {
    "ip" : "80.231.5.0"
  }
}