Elasticsearch-, Reifen- und verschachtelte Abfragen / Verknüpfungen mit ActiveRecord
Ich verwende ElasticSearch mit Tyre, um einige ActiveRecord-Modelle zu indizieren und zu durchsuchen, und ich habe nach dem "richtigen" Weg gesucht, um Assoziationen zu indizieren und zu suchen. Ich habe nicht herausgefunden, was für eine Best Practice dies zu sein scheint, und wollte fragen, ob jemand einen Ansatz hat, von dem er glaubt, dass er wirklich gut funktioniert.
Nehmen wir an, wir haben ein Buch mit Kapiteln. Jedes Buch hat einen Titel und einen Autor sowie eine Reihe von Kapiteln. Jedes Kapitel hat Text. Wir möchten die Felder des Buches und den Text des Kapitels indizieren, damit Sie nach einem Buch nach Autor oder nach einem Buch mit bestimmten Wörtern suchen können.
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
Also mache ich die Suche mit:
s = Book.search do
query { string query_string }
end
Das funktioniert nicht, obwohl es so aussieht, als ob die Indizierung dies tun sollte. Wenn ich stattdessen indexiere:
indexes :chapters, :as => 'chapters.map{|c| c.chapter_text}.join('|'), :analyzer => 'snowball'
Das macht den Text durchsuchbar, aber offensichtlich ist es kein netter Hack und es verliert das eigentliche zugehörige Objekt. Ich habe versucht, Variationen der Suche, wie:
s = Book.search do
query do
boolean do
should { string query_string }
should { string "chapters.chapter_text:#{query_string}" }
end
end
end
Auch dort ohne Glück. Wenn jemand ein gutes, klares Beispiel für das Indizieren und Durchsuchen der zugehörigen ActiveRecord-Objekte mithilfe von Tire hat, ist dies anscheinend eine wirklich gute Ergänzung der Wissensdatenbank.
Vielen Dank für alle Ideen und Beiträge.