スクリプトプロセッサ
受信したドキュメントに対してインラインまたは保存された script を実行します。スクリプトは ingest
コンテキストで実行されます。
スクリプトプロセッサは、受信する各ドキュメントのスクリプトを再コンパイルしないように script cache を使用します。パフォーマンスを向上させるために、スクリプトプロセッサを本番環境で使用する前に、スクリプトキャッシュが適切なサイズであることを確認してください。
名前 | 必須 | デフォルト | 説明 |
---|---|---|---|
lang |
いいえ | “painless” | スクリプト言語. |
id |
いいえ | - | 保存されたスクリプトのID。 |
もし source
が指定されていない場合、このパラメータは必須です。 |
| source
| いいえ | - | インラインスクリプト。
もし id
が指定されていない場合、このパラメータは必須です。 |
| params
| いいえ | - | スクリプトのパラメータを含むオブジェクト。 |
| description
| いいえ | - | プロセッサの説明。プロセッサの目的や構成を説明するのに役立ちます。 |
| if
| いいえ | - | プロセッサを条件付きで実行します。プロセッサを条件付きで実行するを参照してください。 |
| ignore_failure
| いいえ | false
| プロセッサの失敗を無視します。パイプラインの失敗を処理するを参照してください。 |
| on_failure
| いいえ | - | プロセッサの失敗を処理します。パイプラインの失敗を処理するを参照してください。 |
| tag
| いいえ | - | プロセッサの識別子。デバッグやメトリクスに役立ちます。
ソースフィールドへのアクセス
スクリプトプロセッサは、各受信ドキュメントのJSONソースフィールドを一連のマップ、リスト、およびプリミティブに解析します。Painlessスクリプトでこれらのフィールドにアクセスするには、map access operator を使用します: ctx['my-field']
。また、ショートハンド ctx.<my-field>
構文を使用することもできます。
スクリプトプロセッサは ctx['_source']['my-field']
または ctx._source.<my-field>
構文をサポートしていません。
次のプロセッサは、Painlessスクリプトを使用して tags
フィールドを env
ソースフィールドから抽出します。
Python
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)
Ruby
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
Js
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
を設定します。
Python
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)
Ruby
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
Js
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"
}
}
}
]
}