今日はmappings周りについて学んだ。
_source fieldについて
_source fieldには実際に投入したドキュメントのそのままの値が入っている。つまりCharFilterとかTokenizerとかそういうのが全くかかっていない状態のものが入っている。詳しくは_source fieldを参照。
この_source fieldはsearch APIで検索すると一緒についてくるので、検索結果から投入した情報を取得することができる。
_sourceの中身がある程度大きいなら、検索結果に全ての_sourceが入ってくると転送量が大きくなる問題がある。これはSource filteringという機能で解決できる。search APIを使うときにはSource filteringを利用して、必要最低限の情報を取ってくるというのが基本になりそう。
またそもそも投入するドキュメントがかなり大きい場合(ブログエントリーの本文を全部入れたいとか)、_source自体を保存しないモードを選択できる。これはDisabling the _source fieldを参照。
ただし、_source fieldを無効にすると、Update APIが使えなかったり、Highlightingが使えなかったり、Reindex APIが使えなかったりとか、かなり大きなデメリットもある。
また、_source fieldを無効にしたとしても、特定のfieldだけはデータをとっておきたいということは出来る。これはMappingの定義時にstoreを利用しておけば良い。storeしたfieldを検索時に取ってきたい場合は、fieldsをsearch APIに指定する。
dynamic strict
ElasticsearchでMappingを作ると、デフォルトではDynamic Mappingが有効になっており、ドキュメントを入れる時に新しくfieldを入れると勝手にそのfieldをMappingに追加してしまう。これは便利な半面、typoなどをしても新しくMappingのfieldが定義されてしまうなど問題も多い。
Mappingのdynamicオプションをstrictに設定しておくと、もし自分で定義していないフィールドをIndex APIに渡したとしても、例外が起こるのですぐ気づけるようになる。
個人的にはログとかをElasticsearchに全部入れるなどの用途でないのであれば、基本全てのMappingにはdynamic strictを指定した方が良いのではと思う。
このあたりの詳細はDynamic Mapping | Elasticsearch: The Definitive Guide [2.x] | Elasticを参照。
よく使うFieldのdatatypeについて
FieldのdatatypesはField datatypesに書かれているようにいろいろある。今回は基本型でよく使うものについて軽くまとめておく。
number
Numeric field types | Elasticsearch Guide [8.0] | Elastic
- 数字型
- integer, long, doubleなどいろいろある
- unsignedは指定できないことに注意
- unsignedに出来ないということで、MySQLのBIGINT UNSIGNEDなカラムに入っているデータを入れるのは向かなそうな雰囲気。このようなものはstringのnot_analyzedなフィールドに入れると良さそう。
boolean
Boolean field type | Elasticsearch Guide [8.0] | Elastic
- true, falseで表す型
- false, "false", "off", "no", "0", "" (empty string), 0, 0.0 あたりを渡すと全てfalseと認識してくれる
- 上記以外は全てtrueと扱ってくれる
date
Date field type | Elasticsearch Guide [8.0] | Elastic
- 日付型
- いろんなformatを指定できるけど、date_time_no_millisを使っておくとW3CDTFとして利用できるのでおすすめ