# Ingestnode Grokにてarraylistの処理について

**URL:** <https://discuss.elastic.co/t/ingestnode-grok-arraylist/222390>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [March 6, 2020, 1:06am UTC](https://discuss.elastic.co/t/ingestnode-grok-arraylist/222390 "2020-03-06T01:06:49Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [March 6, 2020, 5:35am UTC](https://discuss.elastic.co/t/ingestnode-grok-arraylist/222390/2 "2020-03-06T05:35:18Z")

</div>

Grok Processorが配列には対応していないと思いますので、全部Painless Scriptで実行するのはどうでしょうか？

```auto
POST /_ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "kv": {
          "field": "message",
          "field_split": """\s(?![\\\[\]!"#$%&'()*+,-./:;<>?@\^`{|}~\w[^ -~｡-ﾟ] ]+?(\s+|$))""",
          "value_split": "="
        }
      },
      {
        "script": {
          "lang": "painless",
          "source": """
              ctx.requestdomain = []; 
              for (line in ctx.request) {
                def matcher = /^https?:\/{2,}(.*?)\//.matcher(line);
                if (matcher.find()) { 
                  ctx.requestdomain.add('*' + matcher.group(1).trim() + '*'); 
                }
              }
            """
        }
      }
    ],
    "on_failure": [
      {
        "set": {
          "field": "_index",
          "value": "failed-index_ddi"
        }
      },
      {
        "set": {
          "field": "error",
          "value": "{{ _ingest.on_failure_message }}"
        }
      }
    ]
  },
  "docs": [
    {
      "_index": "aaa",
      "_id": "id1",
      "_source": {
        "message": "request=http://aaa.com/ request=http://bbb.com/"
      }
    }
  ]
}

```

その結果がこちら。

```auto
{
  "docs" : [
    {
      "doc" : {
        "_index" : "aaa",
        "_type" : "_doc",
        "_id" : "id1",
        "_source" : {
          "request" : [
            "http://aaa.com/",
            "http://bbb.com/"
          ],
          "requestdomain" : [
            "*aaa.com*",
            "*bbb.com*"
          ],
          "message" : "request=http://aaa.com/ request=http://bbb.com/"
        },
        "_ingest" : {
          "timestamp" : "2020-03-06T05:31:21.550618Z"
        }
      }
    }
  ]
}

```

およそ実現されたいことができているのではないかと思います。  
ただし、これを行うためには、elasticsearch.ymlに以下を記述する必要があります。

> script.painless.regex.enabled: true

過去の類似の問い合わせとしては、以下になるかと思います。

> [@Ingest: foreachとgrokを組み合わせた場合の処理について](https://discuss.elastic.co/t/ingest-foreach-grok/101027):
>
> 知りたいこと Ingest Pipelineでforeachの中でgrokを適用し、結果をarrayとして保存する方法について 状況の説明 括弧内にログのコード、次にログのメッセージからなる文字列が、カンマ区切りで出力されているテキストがあります。 （例） [INFO.0001]あいうえおかきくけこ, [INFO.0002]さしすせそ これを、Ingest Pipelineでこのようにパースしたいと考えています。 期待値 { "hoge": ["INFO.0001", "INFO.0002"], "fuga": ["あいうえおかきくけこ", "さしすせそ"] } try まず、splitで配列にし、foreach内でgrokによりコードとメッセージを取るように指定することを考えました。 これだと、hoge, fugaのフィールドに対して最後のループのときの値がセットされるだけです。 { "split": { "field": "message", "separator": "," } }, …

ご参考になれば幸いです。

---

_[View the full topic](https://discuss.elastic.co/t/ingestnode-grok-arraylist/222390)._
