ほんのさっきまで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を作るよりは多少マシなのかな…と思います。
