Help us understand the problem. What is going on with this article?

ElasticSearch(rails)で階層化されたドキュメントの複数フィールドをまとめてAND検索する方法

More than 1 year has passed since last update.

elasticsearch-rails を導入して単純な検索までは簡単に実装できたのですが、階層化されたドキュメントのAND検索をする方法がなかなかでてこなかったのでメモ。

class Article
  include Elasticsearch::Model

  belongs_to :genre

  # こんな感じで階層化されたドキュメントが登録されるようにする
  def as_indexed_json(options = {})
    as_json(
      only: [:title, :content],
      include: {
        genre: {only: :name}
    })
  end

  # 各フィールドをまたいでAND検索
  def multi_field_search
    query = {query:
               {
                 multi_match: {
                   query: query,
                   type: 'cross_fields',
                   fields: %w[title content genre.name],
                   operator: 'and'
                 }
               }
    }
    Article.search(query).records
  end
end

ポイントは以下の2つ

  • multi_matchを使う
  • type に 'cross_fields' を指定する

multi_matchでfieldsに複数のフィールドを指定することができるようになります。fieldsパラメータではgenre.nameのようにドット区切りにして下層のフィールドを指定できます。

これだけですと、AND検索が単一フィールド内でしか行われないため、複数のワードが別々のフィールドに格納されているとマッチしません。そこでtypecross_fieldsを設定すると、フィールドをまたいでAND検索できるようになります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした