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

Пример: Обогащение данных на основе геолокации

geo_match политики обогащения сопоставляют обогащённые данные с поступающими документами на основе географического местоположения, используя geo_shape запрос.

Следующий пример создаёт geo_match политику обогащения, которая добавляет почтовые индексы в поступающие документы на основе набора координат. Затем он добавляет geo_match политику обогащения в процессор в конвейере ingest.

Используйте API создания индекса, чтобы создать исходный индекс, содержащий как минимум одно geo_shape поле.

resp = client.indices.create(
    index="postal_codes",
    mappings={
        "properties": {
            "location": {
                "type": "geo_shape"
            },
            "postal_code": {
                "type": "keyword"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'postal_codes',
  body: {
    mappings: {
      properties: {
        location: {
          type: 'geo_shape'
        },
        postal_code: {
          type: 'keyword'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "postal_codes",
  mappings: {
    properties: {
      location: {
        type: "geo_shape",
      },
      postal_code: {
        type: "keyword",
      },
    },
  },
});
console.log(response);
PUT /postal_codes
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      },
      "postal_code": {
        "type": "keyword"
      }
    }
  }
}

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

resp = client.index(
    index="postal_codes",
    id="1",
    refresh="wait_for",
    document={
        "location": {
            "type": "envelope",
            "coordinates": [
                [
                    13,
                    53
                ],
                [
                    14,
                    52
                ]
            ]
        },
        "postal_code": "96598"
    },
)
print(resp)
response = client.index(
  index: 'postal_codes',
  id: 1,
  refresh: 'wait_for',
  body: {
    location: {
      type: 'envelope',
      coordinates: [
        [
          13,
          53
        ],
        [
          14,
          52
        ]
      ]
    },
    postal_code: '96598'
  }
)
puts response
const response = await client.index({
  index: "postal_codes",
  id: 1,
  refresh: "wait_for",
  document: {
    location: {
      type: "envelope",
      coordinates: [
        [13, 53],
        [14, 52],
      ],
    },
    postal_code: "96598",
  },
});
console.log(response);
PUT /postal_codes/_doc/1?refresh=wait_for
{
  "location": {
    "type": "envelope",
    "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
  },
  "postal_code": "96598"
}

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

  • Один или несколько исходных индексов
  • match_field, geo_shape поле из исходных индексов, используемое для сопоставления с поступающими документами
  • Поля обогащения из исходных индексов, которые вы хотите добавить к поступающим документам
resp = client.enrich.put_policy(
    name="postal_policy",
    geo_match={
        "indices": "postal_codes",
        "match_field": "location",
        "enrich_fields": [
            "location",
            "postal_code"
        ]
    },
)
print(resp)
response = client.enrich.put_policy(
  name: 'postal_policy',
  body: {
    geo_match: {
      indices: 'postal_codes',
      match_field: 'location',
      enrich_fields: [
        'location',
        'postal_code'
      ]
    }
  }
)
puts response
const response = await client.enrich.putPolicy({
  name: "postal_policy",
  geo_match: {
    indices: "postal_codes",
    match_field: "location",
    enrich_fields: ["location", "postal_code"],
  },
});
console.log(response);
PUT /_enrich/policy/postal_policy
{
  "geo_match": {
    "indices": "postal_codes",
    "match_field": "location",
    "enrich_fields": [ "location", "postal_code" ]
  }
}

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

POST /_enrich/policy/postal_policy/_execute?wait_for_completion=false

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

  • Вашу политику обогащения.
  • field поступающих документов, используемое для сопоставления геоформы документов из индекса обогащения.
  • target_field для хранения добавленных данных обогащения для поступающих документов. Это поле содержит match_field и enrich_fields, указанные в вашей политике обогащения.
  • shape_relation, который указывает, как процессор сопоставляет геоформы в поступающих документах с геоформами в документах из индекса обогащения. См. Пространственные отношения для допустимых вариантов и дополнительной информации.
resp = client.ingest.put_pipeline(
    id="postal_lookup",
    processors=[
        {
            "enrich": {
                "description": "Add 'geo_data' based on 'geo_location'",
                "policy_name": "postal_policy",
                "field": "geo_location",
                "target_field": "geo_data",
                "shape_relation": "INTERSECTS"
            }
        }
    ],
)
print(resp)
const response = await client.ingest.putPipeline({
  id: "postal_lookup",
  processors: [
    {
      enrich: {
        description: "Add 'geo_data' based on 'geo_location'",
        policy_name: "postal_policy",
        field: "geo_location",
        target_field: "geo_data",
        shape_relation: "INTERSECTS",
      },
    },
  ],
});
console.log(response);
PUT /_ingest/pipeline/postal_lookup
{
  "processors": [
    {
      "enrich": {
        "description": "Add 'geo_data' based on 'geo_location'",
        "policy_name": "postal_policy",
        "field": "geo_location",
        "target_field": "geo_data",
        "shape_relation": "INTERSECTS"
      }
    }
  ]
}

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

resp = client.index(
    index="users",
    id="0",
    pipeline="postal_lookup",
    document={
        "first_name": "Mardy",
        "last_name": "Brown",
        "geo_location": "POINT (13.5 52.5)"
    },
)
print(resp)
const response = await client.index({
  index: "users",
  id: 0,
  pipeline: "postal_lookup",
  document: {
    first_name: "Mardy",
    last_name: "Brown",
    geo_location: "POINT (13.5 52.5)",
  },
});
console.log(response);
PUT /users/_doc/0?pipeline=postal_lookup
{
  "first_name": "Mardy",
  "last_name": "Brown",
  "geo_location": "POINT (13.5 52.5)"
}

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

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

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

{
  "found": true,
  "_index": "users",
  "_id": "0",
  "_version": 1,
  "_seq_no": 55,
  "_primary_term": 1,
  "_source": {
    "geo_data": {
      "location": {
        "type": "envelope",
        "coordinates": [[13.0, 53.0], [14.0, 52.0]]
      },
      "postal_code": "96598"
    },
    "first_name": "Mardy",
    "last_name": "Brown",
    "geo_location": "POINT (13.5 52.5)"
  }
}

© 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/geo-match-enrich-policy-type.html

Spec-Zone.ru

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