質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

878閲覧

elasticsearch-railsの検索結果の全件をActiveRecord::Relationとして取得したい

glico800

総合スコア6

Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2017/08/09 09:09

編集2017/08/09 09:18

質問

elasticsearch-railsの検索結果の全件をActiveRecord::Relationとして取得したいと考え、以下のように書いてみたのですが、10件しか取得できません。

ruby

1response = Product.search(search_text) 2products = response.records.records 3products.count #=> 10 4response.results.total #=> 200

検索結果を全件ActiveRecord::Relationとして取得するにはどうしたらよいでしょうか?

背景

AdtiveAdminのfilterで以下のようにして、Elasticsearchを利用したい。

ruby

1## models/product.rb 2scope :keyword_search, -> (search) { 3 Product.search(search).records.records 4} 5def self.ransackable_scopes(_auth_object = nil) 6 %i(keyword_search) 7end 8 9## admin/product.rb 10ActiveAdmin.register Project do 11 filter :keyword_search, as: :string 12end

versions

rails (4.2.5.1)
elasticsearch (1.0.17)
elasticsearch-api (1.0.17)
elasticsearch-model (0.1.8)
elasticsearch-rails (0.1.8)
elasticsearch-transport (1.0.17)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

以下の方法で全件取得することができました。

ruby

1response = Product.search(search_text) 2response.results.total #=> 200 3 4product_ids = [] 5page_count = 1 6 7until ( pds = response.page(page_count) ).count == 0 do 8 project_ids = project_ids + pds.map(&:id) 9 page_count += 1 10end 11 12product_ids.length #=> 200 13Product.where(id: product_ids) #=> get ActiveRecord::Relations

投稿2017/08/17 02:27

glico800

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

デフォルトが10件のため、elasticsearch.search に渡す payload に明示的に size オプションを指定すれば取得する数は増やせるが、「全件」という指定はあるのかは不明。

そもそもElasticsearchで全件取ってくるという使い方が、本来の用途と違う可能性があるため、回答済みとしてマークします。

投稿2017/08/10 08:49

glico800

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問