【Ruby】配列を検索条件にしたーい!【Elasticsearch】
目次
本日は業務上で陥った危機(ピンチ)
Elasticsearchで配列をインデックスし検索する方法について
記事を書きたいと思います。
Elasticsearchには配列のフィールドタイプが存在していないが
データ型が統一されている場合、複数のデータを保持する
integer型 -> [1,2,3]
keyword型 -> ["hoge","fuga","foo"]
混合させることは出来ない
[1,"fuga",3] <- ❌
オブジェクトはnestedと呼ばれるフィールドで扱う。
1 2 3 4 5 6 7 8 9 |
settings analysis: analysis do mappings dynamic: 'false' do indexes :contents, type: :nested do indexes :content_id, type: :integer indexes :content_name, type: :text end end end |
配列を使った検索にはtermsクエリなるものが存在し。
完全一致かつOR条件で配列の要素が検索される。
1 2 3 4 5 6 7 8 9 10 |
{ nested: { query: { terms: { 'contents.content_name': {['hoge', 'fuga']} }, path: 'contents' } } } |
しかし実装では
完全一致かつAND条件で配列の要素が検索したかったため
上記のものを改変し、Ruby側でeachのループを回すことで対応した
1 2 3 |
contents.each do |content_id| array << {nested: {query: {match: {'contents.content_id': content_id}},path: 'contents'}} end |
もっとスマートな書き方があるはずなので
学び次第加筆修正いたします。