Zapytania elastyczne, opony i zagnieżdżone zapytania / skojarzenia z ActiveRecord
Używam ElasticSearch z oponą do indeksowania i przeszukiwania niektórych modeli ActiveRecord i szukam „właściwego” sposobu indeksowania i wyszukiwania skojarzeń. Nie znalazłem tego, co wydaje się najlepszą praktyką w tym zakresie, więc chciałem zapytać, czy ktoś ma podejście, które ich zdaniem działa naprawdę dobrze.
Jako przykładowa konfiguracja (jest to zrobione, ale ilustruje problem), powiedzmy, że mamy książkę z rozdziałami. Każda książka ma tytuł i autora oraz kilka rozdziałów. Każdy rozdział zawiera tekst. Chcemy zaindeksować pola książki i tekst rozdziałów, aby można było wyszukać książkę według autora lub każdą książkę z określonymi słowami.
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
Więc wykonuję wyszukiwanie za pomocą:
s = Book.search do
query { string query_string }
end
To nie działa, chociaż wydaje się, że indeksowanie powinno to zrobić. Jeśli zamiast tego indeksuję:
indexes :chapters, :as => 'chapters.map{|c| c.chapter_text}.join('|'), :analyzer => 'snowball'
To sprawia, że tekst może być przeszukiwany, ale oczywiście nie jest to ładny hack i traci rzeczywisty powiązany obiekt. Wypróbowałem odmiany wyszukiwania, takie jak:
s = Book.search do
query do
boolean do
should { string query_string }
should { string "chapters.chapter_text:#{query_string}" }
end
end
end
Tam też nie ma szczęścia. Jeśli ktoś ma dobry, jasny przykład indeksowania i wyszukiwania powiązanych obiektów ActiveRecord przy użyciu Tyru, wydaje się, że byłby to naprawdę dobry dodatek do bazy wiedzy tutaj.
Dziękujemy za wszelkie pomysły i wkłady.