Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Конвейеры по обработке данных ›Обогащение данных

Пример: Обогащение данных по совпадению значения с диапазоном

range Политика обогащения использует term запрос, чтобы сопоставить число, дату или IP-адрес в поступающих документах с диапазоном того же типа в индексе обогащения. Сопоставление диапазона с диапазоном не поддерживается.

В следующем примере создается range политика обогащения, которая добавляет описательное имя сети и ответственный отдел к поступающим документам на основе IP-адреса. Затем эта политика обогащения добавляется в процессор в конвейере обработки данных.

Используйте API создания индекса с соответствующими отображениями для создания исходного индекса.

resp = client.indices.create(
    index="networks",
    mappings={
        "properties": {
            "range": {
                "type": "ip_range"
            },
            "name": {
                "type": "keyword"
            },
            "department": {
                "type": "keyword"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'networks',
  body: {
    mappings: {
      properties: {
        range: {
          type: 'ip_range'
        },
        name: {
          type: 'keyword'
        },
        department: {
          type: 'keyword'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "networks",
  mappings: {
    properties: {
      range: {
        type: "ip_range",
      },
      name: {
        type: "keyword",
      },
      department: {
        type: "keyword",
      },
    },
  },
});
console.log(response);
PUT /networks
{
  "mappings": {
    "properties": {
      "range": { "type": "ip_range" },
      "name": { "type": "keyword" },
      "department": { "type": "keyword" }
    }
  }
}

Следующий запрос API индекса индексирует новый документ в этот индекс.

resp = client.index(
    index="networks",
    id="1",
    refresh="wait_for",
    document={
        "range": "10.100.0.0/16",
        "name": "production",
        "department": "OPS"
    },
)
print(resp)
response = client.index(
  index: 'networks',
  id: 1,
  refresh: 'wait_for',
  body: {
    range: '10.100.0.0/16',
    name: 'production',
    department: 'OPS'
  }
)
puts response
const response = await client.index({
  index: "networks",
  id: 1,
  refresh: "wait_for",
  document: {
    range: "10.100.0.0/16",
    name: "production",
    department: "OPS",
  },
});
console.log(response);
PUT /networks/_doc/1?refresh=wait_for
{
  "range": "10.100.0.0/16",
  "name": "production",
  "department": "OPS"
}

Используйте API создания политики обогащения, чтобы создать политику обогащения с range типом политики. Эта политика должна включать:

  • Один или несколько исходных индексов
  • match_field, поле из исходных индексов, используемое для сопоставления поступающих документов
  • Поля обогащения из исходных индексов, которые вы хотите добавить к поступающим документам

Поскольку мы планируем обогащать документы на основе IP-адреса, match_field политики должно быть полем ip_range.

resp = client.enrich.put_policy(
    name="networks-policy",
    range={
        "indices": "networks",
        "match_field": "range",
        "enrich_fields": [
            "name",
            "department"
        ]
    },
)
print(resp)
response = client.enrich.put_policy(
  name: 'networks-policy',
  body: {
    range: {
      indices: 'networks',
      match_field: 'range',
      enrich_fields: [
        'name',
        'department'
      ]
    }
  }
)
puts response
const response = await client.enrich.putPolicy({
  name: "networks-policy",
  range: {
    indices: "networks",
    match_field: "range",
    enrich_fields: ["name", "department"],
  },
});
console.log(response);
PUT /_enrich/policy/networks-policy
{
  "range": {
    "indices": "networks",
    "match_field": "range",
    "enrich_fields": ["name", "department"]
  }
}

Используйте API выполнения политики обогащения, чтобы создать индекс обогащения для политики.

POST /_enrich/policy/networks-policy/_execute?wait_for_completion=false

Используйте API создания или обновления конвейера, чтобы создать конвейер обработки данных. В конвейере добавьте процессор обогащения, который включает:

  • Вашу политику обогащения.
  • field поступающих документов, используемых для сопоставления документов из индекса обогащения.
  • target_field, используемое для хранения добавленных данных обогащения для поступающих документов. Это поле содержит match_field и enrich_fields, указанные в вашей политике обогащения.
resp = client.ingest.put_pipeline(
    id="networks_lookup",
    processors=[
        {
            "enrich": {
                "description": "Add 'network' data based on 'ip'",
                "policy_name": "networks-policy",
                "field": "ip",
                "target_field": "network",
                "max_matches": "10"
            }
        }
    ],
)
print(resp)
const response = await client.ingest.putPipeline({
  id: "networks_lookup",
  processors: [
    {
      enrich: {
        description: "Add 'network' data based on 'ip'",
        policy_name: "networks-policy",
        field: "ip",
        target_field: "network",
        max_matches: "10",
      },
    },
  ],
});
console.log(response);
PUT /_ingest/pipeline/networks_lookup
{
  "processors" : [
    {
      "enrich" : {
        "description": "Add 'network' data based on 'ip'",
        "policy_name": "networks-policy",
        "field" : "ip",
        "target_field": "network",
        "max_matches": "10"
      }
    }
  ]
}

Используйте конвейер обработки данных для индексирования документа. Поступающий документ должен содержать field, указанное в вашем процессоре обогащения.

resp = client.index(
    index="my-index-000001",
    id="my_id",
    pipeline="networks_lookup",
    document={
        "ip": "10.100.34.1"
    },
)
print(resp)
const response = await client.index({
  index: "my-index-000001",
  id: "my_id",
  pipeline: "networks_lookup",
  document: {
    ip: "10.100.34.1",
  },
});
console.log(response);
PUT /my-index-000001/_doc/my_id?pipeline=networks_lookup
{
  "ip": "10.100.34.1"
}

Чтобы проверить, что процессор обогащения сопоставил и добавил соответствующие данные поля, используйте API получения для просмотра индексированного документа.

resp = client.get(
    index="my-index-000001",
    id="my_id",
)
print(resp)
response = client.get(
  index: 'my-index-000001',
  id: 'my_id'
)
puts response
const response = await client.get({
  index: "my-index-000001",
  id: "my_id",
});
console.log(response);
GET /my-index-000001/_doc/my_id

API возвращает следующий ответ:

{
  "_index" : "my-index-000001",
  "_id" : "my_id",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "ip" : "10.100.34.1",
    "network" : [
      {
        "name" : "production",
        "range" : "10.100.0.0/16",
        "department" : "OPS"
      }
    ]
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/range-enrich-policy-type.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API