Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Пайплайны поглощения ›Справочник по процессорам поглощения

Процессор скриптов

Выполняет встроенный или сохранённый скрипт на поступающих документах. Скрипт выполняется в контексте ingest.

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

Таблица 40. Параметры скрипта

Имя Требуется Значение по умолчанию Описание

lang

нет

"painless"

Язык скрипта.

id

нет

-

Идентификатор сохранённого скрипта. Если параметр source не указан, этот параметр обязателен.

source

нет

-

Встроенный скрипт. Если параметр id не указан, этот параметр обязателен.

params

нет

-

Объект, содержащий параметры для скрипта.

description

нет

-

Описание процессора. Полезно для описания цели процессора или его конфигурации.

if

нет

-

Условное выполнение процессора. См. Условное выполнение процессора.

ignore_failure

нет

false

Игнорировать ошибки для процессора. См. Обработка ошибок пайплайна.

on_failure

нет

-

Обработка ошибок для процессора. См. Обработка ошибок пайплайна.

tag

нет

-

Идентификатор процессора. Полезен для отладки и метрик.

Доступ к полям источника

Процессор скриптов парсит JSON поля источника каждого поступающего документа в набор карт, списков и примитивов. Для доступа к этим полям со скриптом Painless используйте оператор доступа к карте: ctx['my-field']. Также можно использовать сокращённую синтаксическую запись ctx.<my-field>.

Процессор скриптов не поддерживает синтаксисы ctx['_source']['my-field'] или ctx._source.<my-field>.

Следующий процессор использует скрипт Painless для извлечения поля tags из поля источника env.

resp = client.ingest.simulate(
    pipeline={
        "processors": [
            {
                "script": {
                    "description": "Extract 'tags' from 'env' field",
                    "lang": "painless",
                    "source": "\n            String[] envSplit = ctx['env'].splitOnToken(params['delimiter']);\n            ArrayList tags = new ArrayList();\n            tags.add(envSplit[params['position']].trim());\n            ctx['tags'] = tags;\n          ",
                    "params": {
                        "delimiter": "-",
                        "position": 1
                    }
                }
            }
        ]
    },
    docs=[
        {
            "_source": {
                "env": "es01-prod"
            }
        }
    ],
)
print(resp)
response = client.ingest.simulate(
  body: {
    pipeline: {
      processors: [
        {
          script: {
            description: "Extract 'tags' from 'env' field",
            lang: 'painless',
            source: "\n            String[] envSplit = ctx['env'].splitOnToken(params['delimiter']);\n            ArrayList tags = new ArrayList();\n            tags.add(envSplit[params['position']].trim());\n            ctx['tags'] = tags;\n          ",
            params: {
              delimiter: '-',
              position: 1
            }
          }
        }
      ]
    },
    docs: [
      {
        _source: {
          env: 'es01-prod'
        }
      }
    ]
  }
)
puts response
const response = await client.ingest.simulate({
  pipeline: {
    processors: [
      {
        script: {
          description: "Extract 'tags' from 'env' field",
          lang: "painless",
          source:
            "\n            String[] envSplit = ctx['env'].splitOnToken(params['delimiter']);\n            ArrayList tags = new ArrayList();\n            tags.add(envSplit[params['position']].trim());\n            ctx['tags'] = tags;\n          ",
          params: {
            delimiter: "-",
            position: 1,
          },
        },
      },
    ],
  },
  docs: [
    {
      _source: {
        env: "es01-prod",
      },
    },
  ],
});
console.log(response);
POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "script": {
          "description": "Extract 'tags' from 'env' field",
          "lang": "painless",
          "source": """
            String[] envSplit = ctx['env'].splitOnToken(params['delimiter']);
            ArrayList tags = new ArrayList();
            tags.add(envSplit[params['position']].trim());
            ctx['tags'] = tags;
          """,
          "params": {
            "delimiter": "-",
            "position": 1
          }
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "env": "es01-prod"
      }
    }
  ]
}

Процессор производит:

{
  "docs": [
    {
      "doc": {
        ...
        "_source": {
          "env": "es01-prod",
          "tags": [
            "prod"
          ]
        }
      }
    }
  ]
}

Доступ к полям метаданных

Вы также можете использовать процессор скриптов для доступа к полям метаданных. Следующий процессор использует скрипт Painless для установки _index поступающего документа.

resp = client.ingest.simulate(
    pipeline={
        "processors": [
            {
                "script": {
                    "description": "Set index based on `lang` field and `dataset` param",
                    "lang": "painless",
                    "source": "\n            ctx['_index'] = ctx['lang'] + '-' + params['dataset'];\n          ",
                    "params": {
                        "dataset": "catalog"
                    }
                }
            }
        ]
    },
    docs=[
        {
            "_index": "generic-index",
            "_source": {
                "lang": "fr"
            }
        }
    ],
)
print(resp)
response = client.ingest.simulate(
  body: {
    pipeline: {
      processors: [
        {
          script: {
            description: 'Set index based on `lang` field and `dataset` param',
            lang: 'painless',
            source: "\n            ctx['_index'] = ctx['lang'] + '-' + params['dataset'];\n          ",
            params: {
              dataset: 'catalog'
            }
          }
        }
      ]
    },
    docs: [
      {
        _index: 'generic-index',
        _source: {
          lang: 'fr'
        }
      }
    ]
  }
)
puts response
const response = await client.ingest.simulate({
  pipeline: {
    processors: [
      {
        script: {
          description: "Set index based on `lang` field and `dataset` param",
          lang: "painless",
          source:
            "\n            ctx['_index'] = ctx['lang'] + '-' + params['dataset'];\n          ",
          params: {
            dataset: "catalog",
          },
        },
      },
    ],
  },
  docs: [
    {
      _index: "generic-index",
      _source: {
        lang: "fr",
      },
    },
  ],
});
console.log(response);
POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "script": {
          "description": "Set index based on `lang` field and `dataset` param",
          "lang": "painless",
          "source": """
            ctx['_index'] = ctx['lang'] + '-' + params['dataset'];
          """,
          "params": {
            "dataset": "catalog"
          }
        }
      }
    ]
  },
  "docs": [
    {
      "_index": "generic-index",
      "_source": {
        "lang": "fr"
      }
    }
  ]
}

Процессор изменяет _index документа на fr-catalog из generic-index.

{
  "docs": [
    {
      "doc": {
        ...
        "_index": "fr-catalog",
        "_source": {
          "lang": "fr"
        }
      }
    }
  ]
}

© 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/script-processor.html

Spec-Zone.ru

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