$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

今日のElasticsearch学び Vol.2 - Mappings編

 今日は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に書かれているようにいろいろある。今回は基本型でよく使うものについて軽くまとめておく。

string

https://www.elastic.co/guide/en/elasticsearch/reference/current/string.html

  • 文字列型
  • 文字列型をさらに分類するとFull textとKeywordsがある
  • Full textは全文検索用。自分でAnalyzerとかを指定して、トークナイズとかを行っておくようなもの。
  • Keywordsは特にトークナイズなどを行わず、与えたものをそのままtermとして扱うもの。index = not_analyzedと指定しておくと、こちらになる。

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として利用できるのでおすすめ

copy_toについて

 copy_toを用いると、index APIに渡したあるfieldのデータを特定のfieldにcopyしてくれて便利。ただし、copy_toを使うとcopy先のデータは_source fieldに入ってくれないので注意。