Elasticsearch, Tire и вложенные запросы/ассоциации с ActiveRecord

Я использую ElasticSearch с Tire для индексации и поиска некоторых моделей ActiveRecord, и я искал «правильный» способ индексации и поиска ассоциаций. Я не нашел того, что кажется лучшей практикой для этого, поэтому я хотел спросить, есть ли у кого-нибудь подход, который, по их мнению, работает действительно хорошо.

В качестве примера установки (это составлено, но иллюстрирует проблему ), скажем, у нас есть книга с главами. У каждой книги есть название и автор, и куча глав. В каждой главе есть текст. Мы хотим проиндексировать поля книги и текст глав, чтобы вы могли искать книгу по автору или любую книгу с определенными словами в ней.

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

Итак, я выполняю поиск с помощью:

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

Это не работает, хотя кажется, что индексация должна это делать. Если вместо этого я проиндексирую:

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

Это делает текст доступным для поиска, но, очевидно, это нехороший хак, и он теряет фактически связанный объект. Я пробовал варианты поиска, например:

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

Там тоже не повезло. Если у кого-то есть хороший, наглядный пример индексации и поиска связанных объектов ActiveRecord с помощью Tire, похоже, это было бы действительно хорошим дополнением к базе знаний здесь.

Спасибо за любые идеи и вклады.

27
задан karmi 6 July 2013 в 11:11
поделиться