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

Elasticsearch with RoRで色んな検索をしてみる。その2

More than 3 years have passed since last update.

Elasticsearch with RoRで色んな検索をしてみる。その1の続きです。

今回は自分がハマった部分をサクサクっとご紹介します。
ちなみに体系的に記述する時間がないのと、現在Golangをやっている理由から
記述内容が微妙に異なる可能性がありますので
あらかじめご了承ください。

はじめに

せっかく全文検索エンジンをRailsで操作できるのに、
単なる全文検索だと楽にならない。。。
と思ったので、
分類分け方法をご紹介します。
ちなみに私がハマったのは、Elasticsearchの機能をRailsで書いた時の
構文エラーが主なものです。

前提

前回に引き続き以下のようなmodelを利用します。

$ cat ./app/models/concerns/xxx.rb
class Xxx < ApplicationRecord

  include Elasticsearch::Model

  index_name "es_#{Rails.env}"
  document_type 'test'

  [snip]

  def self.search(params = {})

    # ここに書いてく感じのやつです。

    # 検索クエリをなげて結果を表示
    __elasticsearch__.search(search_definition)
  end

一般的なグルーピング

元はこちらです。

xxx.levelというのがあるとして
こちらをGropingします。

### model
aggregation :level do
  terms field: 'level'
end

### view (haml)
= Xxx.Search.aggregations.level.buckets ### ハッシュが表示される。

リレーション先の値を表示する。

xxxに対して yyy がリレーションされている場合です。

### model
aggregation :yyy_group do
  terms field: 'yyy.group'
end

### view (haml)
= Xxx.Search.aggregations.yyy_group.buckets ### ハッシュが表示される。

ネストしてみる

xxx.levelに yyy.groupを配列的にくっつけます。
例えば、 level = [1,2,3]で yyy.group = ["group1", "group2"]と仮定した場合
出力結果が

{
 1 => {"group1" => 1, "group2" => 2},
 2 => {"group1" => 5, "group2" => 3},
 3 => {"group1" => 0, "group2" => 9},
}

のように表示されます。

aggregation :level do
  terms field: 'xxx.level' do
    aggregation :yyy_group do
      terms field: 'yyy.group'
    end
  end
end
### view (haml)
- Xxx.Search.aggregations.level.buckets do | level |
  level.aggregations.yyy_group.buckets ### ハッシュが表示される。

Stepしてみる。

ある値ごとにカテゴリーを作成したい場合は以下のような形でできます。

### model
price_step = 100
aggregation :price do
  range field: 'rates_from', ranges: [ { to:  price_step }, {  from:  price_step , to: price_step * 2}, {  from: price_step * 2, to: price_step * 4}, {from: price_step * 4 }]
end

### view
= Xxx.Search.aggregations.price.buckets

他にも色んな分け方ができますが、
長くだらだら記述しそうなので、一旦ここまでにします。

nekakoshi
柏の葉周辺で会社やってます。 柏の葉にプログラマ・エンジニアを増やす活動してます。 基本サーバサイド側で働いておりまする。 WEBからOS層で活動中の何でも屋です。
http://nekakoshi.hatenablog.jp/
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