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


(Pokotyamu) #1

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

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

{"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 させるという使い方は可能でしょうか?

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


(Jun Ohtani) #2

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

https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html#_customising_detected_date_formats

これでできそうですよと回答しようと思ったのですが、特定の文字が入っていないとうまく動作しないバグがあります。
その修正がこちらになり、現時点では、次期バージョン6.0.0に含まれる予定になっています。
現時点では、何かしら、特定のフィールド名になるようにして、Dynamic Templateを利用する方法になるかと。

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


(Pokotyamu) #3

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

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

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

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

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


(Jun Ohtani) #4

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

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


(Pokotyamu) #5

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

$ 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 で自分たちのやりたいことが実現できそうか?ということについての調査段階なので、先送りにしています。
また別途相談させて頂くことがあるかと思いますが、今後共よろしくお願い致します。


(system) #6

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