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.

questionAnswers(2)

yourAnswerToTheQuestion