私はタイヤで ElasticSearch を使用して、いくつかの ActiveRecord モデルのインデックス作成と検索を行っています。関連付けのインデックス作成と検索を行う「正しい」方法を探していました。このためのベストプラクティスと思われるものを見つけられなかったので、本当にうまくいくと思うアプローチを誰かが持っているかどうか尋ねたかった.
セットアップの例として (これはでっち上げですが、問題を示しています)、章のある本があるとしましょう。各本には、タイトルと著者、および多数の章があります。各章にはテキストがあります。本のフィールドと章のテキストに索引を付けたいので、著者別に本を検索したり、特定の単語が含まれる本を検索したりできます。
class Book < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
has_many :chapters
mapping do
indexes :title, :analyzer => 'snowball', :boost => 100
indexes :author, :analyzer => 'snowball'
indexes :chapters, type: 'object', properties: {
chapter_text: { type: 'string', analyzer: 'snowball' }
}
end
end
class Chapter < ActiveRecord::Base
belongs_to :book
end
だから私は検索を行います:
s = Book.search do
query { string query_string }
end
インデックス作成でうまくいくように見えますが、うまくいきません。代わりにインデックスを作成する場合:
indexes :chapters, :as => 'chapters.map{|c| c.chapter_text}.join('|'), :analyzer => 'snowball'
これにより、テキストが検索可能になりますが、明らかにこれは適切なハックではなく、実際に関連付けられたオブジェクトが失われます。次のような検索のバリエーションを試しました。
s = Book.search do
query do
boolean do
should { string query_string }
should { string "chapters.chapter_text:#{query_string}" }
end
end
end
そこにも運がありません。Tire を使用して関連付けられた ActiveRecord オブジェクトにインデックスを付けて検索する明確で明確な例を誰かが持っている場合、それはここのナレッジ ベースへの本当に良い追加になるようです。
アイデアや貢献に感謝します。