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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage