Я использую 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, похоже, это было бы действительно хорошим дополнением к базе знаний здесь.
Спасибо за любые идеи и вклады.