Elasticsearchのクエリを書くためのDSL用gemがあった

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


カテゴリー Ruby, Ruby on Rails | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です