ほんのさっきまでRubyのハッシュを自分で組んで、Elasticsearchクラスのsearchメソッドに渡していました。なんとも辛い感じで、いい方法はないんかい!と思っていて、こうなったらgem作るか…と思ったのですが、よく考えたらすでにあってもおかしくなかろう!と思ってrubygemsを検索したところ、elasticsearch-dslというgemがありました。
github: elastic/elasticsearch-ruby/elasctisearch-dsl
elasticからの公式のDSLですかね。
こ、これじゃね…!?と思って使おうとしたのですが、例だと、Elasticsearch::DSLをincludeして使う、みたいな感じなのですが、このクラスもsearchメソッドを定義しており、elasticsearch-modelのsearchメソッドと競合します。マジで辛い。簡単にsearchメソッドとか作らないでほしい…。しかもクエリを作るだけであって検索自体はしないのにsearchメソッドっておかしくない???という疑問を抱きつつも、includeせずに使えるんじゃね?と思って試したら使えました。
まずはGemfileに書いてからbundle installでインストールしましょう。
gem 'elasticsearch-dsl'
次に、modelにてrequireします。
そして、検索用クエリを生成するメソッドを定義します。
require 'elasticsearch/dsl' class Shop < ActiveRecord::Base include Elasticsearch::Model # 省略 def self.elasticsearch_query(keywords, filter_conditions, sorts=[]) definition = Elasticsearch::DSL::Search::Search.new definition.query do filtered do query do simple_query_string do query keywords.join(' ') fields %w(name yomigana) default_operator :and end end if filter_conditions.present? filter do terms filter_conditions end end end end if sorts.present? definition.sort do sorts.each do |sort| column, sort_order = sort.first by column, order: sort_order end end end definition.to_hash end end
一応、こんな感じで検索条件を記述していくことができます。
自力でHashを作るよりは多少マシなのかな…と思います。