# 不特定カラムに対して日付のフォーマットを指定する

**URL:** <https://discuss.elastic.co/t/topic/93676>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [July 19, 2017, 1:47am UTC](https://discuss.elastic.co/t/topic/93676 "2017-07-19T01:47:30Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![pokotyamu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pokotyamu/32/20206_2.png) [@pokotyamu](https://discuss.elastic.co/u/pokotyamu)\
**Post date:** [July 19, 2017, 1:47am UTC](https://discuss.elastic.co/t/topic/93676/1 "2017-07-19T01:47:30Z")

</div>

お世話になっております。

以下のようなフォーマットの日付データを bulk api にて取り込むことを考えています。

```auto
{"index":{"_index":"sample_index","_type":"sample_type","_id":"1"}}
{"DATE1":"2017年07月13日"}
{"index":{"_index":"sample_index","_type":"sample_type","_id":"2"}}
{"DATE2":"2017/07/14"}
{"index":{"_index":"sample_index","_type":"sample_type","_id":"3"}}
{"DATE3":"2017-07-15"}
{"index":{"_index":"sample_index","_type":"sample_type","_id":"4"}}
{"DATE4":"2017.07.16"}

```

事前に、 DATE1~4 に対して、 mapping を定義すれば、日付として取り込むことは確認出来たのですが、予めフォーマットを登録しておいて、どの index でもこのフォーマット(例えば、`yyyy年mm月dd日`)をカラムを指定せずに、自動 mapping させるという使い方は可能でしょうか？

お手数をおかけしますが、ご教授頂ければ幸いです。  
よろしくお願い致します。

---

<div class="post-metadata">

**Author:** ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)\
**Post date:** [July 19, 2017, 9:22am UTC](https://discuss.elastic.co/t/topic/93676/2 "2017-07-19T09:22:56Z")

</div>

Date detectionの`dynamic_date_formats`というのがあります。

[https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html#\_customising\_detected\_date\_formats](https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html#_customising_detected_date_formats)

これでできそうですよと回答しようと思ったのですが、特定の文字が入っていないとうまく動作しないバグがあります。  
その修正が[こちら](https://github.com/elastic/elasticsearch/pull/22171)になり、現時点では、次期バージョン6.0.0に含まれる予定になっています。  
現時点では、何かしら、特定のフィールド名になるようにして、[Dynamic Template](https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html)を利用する方法になるかと。

ちなみに、どのようなユースケースで、任意のカラムを自動的にマッピングさせたいのでしょうか？  
管理されていないデータを保存したいということでしょうか？

---

<div class="post-metadata">

**Author:** ![pokotyamu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pokotyamu/32/20206_2.png) [@pokotyamu](https://discuss.elastic.co/u/pokotyamu)\
**Post date:** [July 19, 2017, 10:15am UTC](https://discuss.elastic.co/t/topic/93676/3 "2017-07-19T10:15:17Z")

</div>

回答ありがとうございます！

> Date detectionのdynamic\_date\_formatsというのがあります。  
> これでできそうですよと回答しようと思ったのですが、特定の文字が入っていないとうまく動作しないバグがあります。

なるほど！  
6.0.0 にあがったタイミングで試してみます。

> ちなみに、どのようなユースケースで、任意のカラムを自動的にマッピングさせたいのでしょうか？  
> 管理されていないデータを保存したいということでしょうか？

そうですね。  
ユーザーがアップロードした CSV(中身のカラムはユーザーの自由) をアプリ内で JSON に変換した後 bulk でカラムそのままに保存ということを考えているため、任意のカラムでのデータ保存が必要になり、相談させていただきました。

---

<div class="post-metadata">

**Author:** ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)\
**Post date:** [July 20, 2017, 2:59am UTC](https://discuss.elastic.co/t/topic/93676/4 "2017-07-20T02:59:04Z")

</div>

ちなみに、6.0.0-alpha2ではすでに取り込まれていると思うので、試すことができます。

> [@pokotyamu](#):
>
> ユーザーがアップロードした CSV(中身のカラムはユーザーの自由) をアプリ内で JSON に変換した後 bulk でカラムそのままに保存ということを考えているため、任意のカラムでのデータ保存が必要になり、相談させていただきました。

少しきになるのは、同一のインデックスに多数のユーザが無制限にフィールドを作ると色々と管理などが大変そうだなというのがありますね。。。  
また、アップロードをし直したりした時の挙動も気になります。  
その辺りは別途対策などを検討した方がいいかもです。

---

<div class="post-metadata">

**Author:** ![pokotyamu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/pokotyamu/32/20206_2.png) [@pokotyamu](https://discuss.elastic.co/u/pokotyamu)\
**Post date:** [July 20, 2017, 4:14am UTC](https://discuss.elastic.co/t/topic/93676/5 "2017-07-20T04:14:37Z")

</div>

> [@johtani](#):
>
> ちなみに、6.0.0-alpha2ではすでに取り込まれていると思うので、試すことができます。

alpha2 で試してみた結果、意図通りの結果を得ることができました。  
重ね重ねありがとうございました！

```auto
$ curl -X PUT -H 'Content-Type: application/json' http://localhost:9200/my_index -d '
{
  "mappings": {
    "my_type": {
      "dynamic_date_formats": ["yyyy年MM月dd日", "yyyy/MM/dd", "yyyy.MM.dd", "yyyy-MM-dd"]
    }
  }
}' | jq .
{
  "acknowledged": true,
  "shards_acknowledged": true
}
$ curl -X POST -H 'Content-Type: application/json' http://localhost:9200/_bulk --data-binary @test.json 
$ curl -X GET http://localhost:9200/my_index | jq .
{
  "my_index": {
    "aliases": {},
    "mappings": {
      "my_type": {
        "dynamic_date_formats": [
          "yyyy年MM月dd日",
          "yyyy/MM/dd",
          "yyyy.MM.dd",
          "yyyy-MM-dd"
        ],
        "properties": {
          "DATE1": {
            "type": "date",
            "format": "yyyy年MM月dd日"
          },
          "DATE2": {
            "type": "date",
            "format": "yyyy/MM/dd"
          },
          "DATE3": {
            "type": "date",
            "format": "yyyy-MM-dd"
          },
          "DATE4": {
            "type": "date",
            "format": "yyyy.MM.dd"
          }
        }
      }
    },
  以下略
  }
}

```

> 少しきになるのは、同一のインデックスに多数のユーザが無制限にフィールドを作ると色々と管理などが大変そうだなというのがありますね。。。  
> また、アップロードをし直したりした時の挙動も気になります。  
> その辺りは別途対策などを検討した方がいいかもです。

ここについては、チーム内でも話しに上がったのですが、今は Elasticsearch で自分たちのやりたいことが実現できそうか？ということについての調査段階なので、先送りにしています。  
また別途相談させて頂くことがあるかと思いますが、今後共よろしくお願い致します。

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [August 17, 2017, 4:25am UTC](https://discuss.elastic.co/t/topic/93676/6 "2017-08-17T04:25:50Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
