Consultas / associações Elasticsearch, Tyre e aninhadas com ActiveRecord

Estou usando o ElasticSearch com o Tyre para indexar e pesquisar alguns modelos do ActiveRecord e tenho procurado a maneira "certa" de indexar e pesquisar associações. Eu não encontrei o que parece ser uma prática recomendada para isso, então eu queria perguntar se alguém tem uma abordagem que eles acham que funciona muito bem.

Como um exemplo de configuração (isso é feito, mas ilustra o problema), digamos que temos um livro, com capítulos. Cada livro tem um título e autor, e um monte de capítulos. Cada capítulo tem texto. Queremos indexar os campos do livro e o texto dos capítulos para que você possa procurar um livro por autor ou qualquer livro com certas palavras nele.

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

Então eu faço a pesquisa com:

s = Book.search do
  query { string query_string }
end

Isso não funciona, embora pareça que a indexação deva fazê-lo. Se ao invés eu indexar:

indexes :chapters, :as => 'chapters.map{|c| c.chapter_text}.join('|'), :analyzer => 'snowball'

Isso torna o texto pesquisável, mas obviamente não é um bom hack e perde o objeto associado real. Eu tentei variações da pesquisa, como:

s = Book.search do
  query do
    boolean do
      should { string query_string }
      should { string "chapters.chapter_text:#{query_string}" }
    end
  end
end

Sem sorte também. Se alguém tiver um bom e claro exemplo de indexação e busca de objetos ActiveRecord associados usando o Tyre, parece que isso seria uma boa adição à base de conhecimento aqui.

Obrigado por quaisquer ideias e contribuições.

questionAnswers(2)

yourAnswerToTheQuestion