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.