【发布时间】:2012-07-26 09:54:24
【问题描述】:
我正在使用 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'
这使得文本可搜索,但显然它不是一个很好的 hack,它会丢失实际的关联对象。我已经尝试过搜索的变体,例如:
s = Book.search do
query do
boolean do
should { string query_string }
should { string "chapters.chapter_text:#{query_string}" }
end
end
end
那里也没有运气。如果有人有一个使用 Tire 索引和搜索关联 ActiveRecord 对象的良好、清晰的示例,那么这似乎是对这里知识库的一个非常好的补充。
感谢您的任何想法和贡献。
【问题讨论】:
-
如果答案对您有帮助,请考虑将其标记为已接受。
-
我花了一些时间来测试和确认(被拉到另一个项目中)但是是的,你的回答很好,谢谢 - 我相信它会对很多人有所帮助开始吧。
标签: elasticsearch tire