スクリプトプロセッサ

受信したドキュメントに対してインラインまたは保存された script を実行します。スクリプトは ingest コンテキストで実行されます。

スクリプトプロセッサは、受信する各ドキュメントのスクリプトを再コンパイルしないように script cache を使用します。パフォーマンスを向上させるために、スクリプトプロセッサを本番環境で使用する前に、スクリプトキャッシュが適切なサイズであることを確認してください。


表 39. スクリプトオプション

名前 必須 デフォルト 説明
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

  1. resp = client.ingest.simulate(
  2. pipeline={
  3. "processors": [
  4. {
  5. "script": {
  6. "description": "Extract 'tags' from 'env' field",
  7. "lang": "painless",
  8. "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 ",
  9. "params": {
  10. "delimiter": "-",
  11. "position": 1
  12. }
  13. }
  14. }
  15. ]
  16. },
  17. docs=[
  18. {
  19. "_source": {
  20. "env": "es01-prod"
  21. }
  22. }
  23. ],
  24. )
  25. print(resp)

Ruby

  1. response = client.ingest.simulate(
  2. body: {
  3. pipeline: {
  4. processors: [
  5. {
  6. script: {
  7. description: "Extract 'tags' from 'env' field",
  8. lang: 'painless',
  9. 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 ",
  10. params: {
  11. delimiter: '-',
  12. position: 1
  13. }
  14. }
  15. }
  16. ]
  17. },
  18. docs: [
  19. {
  20. _source: {
  21. env: 'es01-prod'
  22. }
  23. }
  24. ]
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.ingest.simulate({
  2. pipeline: {
  3. processors: [
  4. {
  5. script: {
  6. description: "Extract 'tags' from 'env' field",
  7. lang: "painless",
  8. source:
  9. "\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 ",
  10. params: {
  11. delimiter: "-",
  12. position: 1,
  13. },
  14. },
  15. },
  16. ],
  17. },
  18. docs: [
  19. {
  20. _source: {
  21. env: "es01-prod",
  22. },
  23. },
  24. ],
  25. });
  26. console.log(response);

コンソール

  1. POST _ingest/pipeline/_simulate
  2. {
  3. "pipeline": {
  4. "processors": [
  5. {
  6. "script": {
  7. "description": "Extract 'tags' from 'env' field",
  8. "lang": "painless",
  9. "source": """
  10. String[] envSplit = ctx['env'].splitOnToken(params['delimiter']);
  11. ArrayList tags = new ArrayList();
  12. tags.add(envSplit[params['position']].trim());
  13. ctx['tags'] = tags;
  14. """,
  15. "params": {
  16. "delimiter": "-",
  17. "position": 1
  18. }
  19. }
  20. }
  21. ]
  22. },
  23. "docs": [
  24. {
  25. "_source": {
  26. "env": "es01-prod"
  27. }
  28. }
  29. ]
  30. }

プロセッサは次のように出力します:

コンソール-結果

  1. {
  2. "docs": [
  3. {
  4. "doc": {
  5. ...
  6. "_source": {
  7. "env": "es01-prod",
  8. "tags": [
  9. "prod"
  10. ]
  11. }
  12. }
  13. }
  14. ]
  15. }

メタデータフィールドへのアクセス

スクリプトプロセッサを使用してメタデータフィールドにアクセスすることもできます。次のプロセッサは、Painlessスクリプトを使用して受信ドキュメントの _index を設定します。

Python

  1. resp = client.ingest.simulate(
  2. pipeline={
  3. "processors": [
  4. {
  5. "script": {
  6. "description": "Set index based on `lang` field and `dataset` param",
  7. "lang": "painless",
  8. "source": "\n ctx['_index'] = ctx['lang'] + '-' + params['dataset'];\n ",
  9. "params": {
  10. "dataset": "catalog"
  11. }
  12. }
  13. }
  14. ]
  15. },
  16. docs=[
  17. {
  18. "_index": "generic-index",
  19. "_source": {
  20. "lang": "fr"
  21. }
  22. }
  23. ],
  24. )
  25. print(resp)

Ruby

  1. response = client.ingest.simulate(
  2. body: {
  3. pipeline: {
  4. processors: [
  5. {
  6. script: {
  7. description: 'Set index based on `lang` field and `dataset` param',
  8. lang: 'painless',
  9. source: "\n ctx['_index'] = ctx['lang'] + '-' + params['dataset'];\n ",
  10. params: {
  11. dataset: 'catalog'
  12. }
  13. }
  14. }
  15. ]
  16. },
  17. docs: [
  18. {
  19. _index: 'generic-index',
  20. _source: {
  21. lang: 'fr'
  22. }
  23. }
  24. ]
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.ingest.simulate({
  2. pipeline: {
  3. processors: [
  4. {
  5. script: {
  6. description: "Set index based on `lang` field and `dataset` param",
  7. lang: "painless",
  8. source:
  9. "\n ctx['_index'] = ctx['lang'] + '-' + params['dataset'];\n ",
  10. params: {
  11. dataset: "catalog",
  12. },
  13. },
  14. },
  15. ],
  16. },
  17. docs: [
  18. {
  19. _index: "generic-index",
  20. _source: {
  21. lang: "fr",
  22. },
  23. },
  24. ],
  25. });
  26. console.log(response);

コンソール

  1. POST _ingest/pipeline/_simulate
  2. {
  3. "pipeline": {
  4. "processors": [
  5. {
  6. "script": {
  7. "description": "Set index based on `lang` field and `dataset` param",
  8. "lang": "painless",
  9. "source": """
  10. ctx['_index'] = ctx['lang'] + '-' + params['dataset'];
  11. """,
  12. "params": {
  13. "dataset": "catalog"
  14. }
  15. }
  16. }
  17. ]
  18. },
  19. "docs": [
  20. {
  21. "_index": "generic-index",
  22. "_source": {
  23. "lang": "fr"
  24. }
  25. }
  26. ]
  27. }

プロセッサはドキュメントの _indexfr-catalog から generic-index に変更します。

コンソール-結果

  1. {
  2. "docs": [
  3. {
  4. "doc": {
  5. ...
  6. "_index": "fr-catalog",
  7. "_source": {
  8. "lang": "fr"
  9. }
  10. }
  11. }
  12. ]
  13. }