大佬教程收集整理的这篇文章主要介绍了ElasticSearch,Tire和嵌套查询/与ActiveRecord的关联,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Tire中对ActiveRecord关联的支持正在起作用,但是需要在应用程序内部进行一些调整。毫无疑问,图书馆应该在这里做得更好,将来肯定会做得更好。
就是说,这是一个可以在Elasticsearch中与Rails的关联一起工作的Tire配置的完整示例:active_record_associations.rb
让我在这里强调几件事。
首先,必须确保将关联的更改通知关联的父模型。
给定我们有一个Chapter@H_772_14@模型“属于” a
Book@H_772_14@,我们需要做:
class Chapter < ActiveRecord::Base
belongs_to :book, touch: true
end
@H_772_14@
这样,当我们执行以下操作时:
book.chapters.create text: "Lorem ipsum...."
@H_772_14@
该book@H_772_14@实例被通知增加的一章。
整理完这一部分后,我们需要将有关更改通知给 Tire ,并相应地更新elasticsearch索引:
class Book < ActiveRecord::Base
has_many :chapters
after_touch() { tire.update_index }
end
@H_772_14@
(毫无疑问, Tire
应该after_touch@H_772_14@自行拦截通知,而不是强迫您这样做。这是另一方面,证明了绕过图书馆的限制以不伤眼睛的方式进行工作有多么容易)
尽管自述文件中提到您必须在Rails <3.1中禁用自动的“在JsON中添加根密钥”,但许多人还是忘记了它,因此您也必须在类定义中包括它:
self.include_root_in_Json = false
@H_772_14@
现在是我们工作的重点-为我们的文档(模型)定义适当的映射:
@H_122_13@mapPing do indexes @R_750_6964@, type: 'String', boost: 10, analyzer: 'snowball' indexes :created_at, type: 'date' indexes :chapters do indexes :text, analyzer: 'snowball' end end @H_772_14@
请注意,我们title@H_772_14@使用
created_at@H_772_14@了相关模型的升序索引(作为“日期”)和章节文本。在Elasticsearch中,所有数据都有效地“归一化”为单个文档(如果这样的话会稍微有意义)。
作为最后一步,我们必须正确地序列化Elasticsearch索引中的文档。注意我们如何利用 ActiveRecord中 的便捷to_Json@H_772_14@方法:
__
def to_indexed_Json
to_Json( include: { chapters: { only: [:text] } } )
end
@H_772_14@
设置好所有这些设置之后,我们就可以在文档的Book@H_772_14@和
Chapter@H_772_14@部分中搜索属性。
请运行开头链接的Ruby文件active_record_associations.rb,以查看完整图片。
有关更多信息,请参考以下资源:
我正在将ElasticSearch与Tire一起使用来对一些ActiveRecord模型进行索引和搜索,并且我一直在寻找索引和搜索关联的“正确”方法。我还没有找到最佳解决方案,所以我想问问是否有人采用他们认为确实有效的方法。
作为一个示例设置(已完成,但说明了问题),假设我们有一本书,带有章节。每本书都有标题和作者,以及许多章节。每章都有文字。我们希望为书的字段和章节的文本建立索引,以便您可以按作者搜索书,也可以搜索其中包含某些单词的任何书。
class Book < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::CallBACks
has_many :chapters
mapping do
indexes @R_750_6964@,: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
@H_772_14@
因此,我使用以下命令进行搜索:
s = Book.search do
query { String query_String }
end
@H_772_14@
即使看起来索引应该执行此操作,这也不起作用。相反,如果我索引:
indexes :chapters,:as => 'chapters.map{|c| c.chapter_text}.join('|'),:analyzer => 'snowball'
@H_772_14@
这样可以使文本可搜索,但是显然这不是一个好办法,并且会丢失实际的关联对象。我已经尝试过各种搜索方式,例如:
s = Book.search do
query do
Boolean do
should { String query_String }
should { String "chapters.chapter_text:#{query_String}" }
end
end
end
@H_772_14@
那里也没有运气。如果有人有一个很好的,清晰的示例,就可以使用Tire索引和搜索关联的ActiveRecord对象,那么这似乎是对此处知识库的真正补充。
感谢您的任何想法和贡献。
以上是大佬教程为你收集整理的ElasticSearch,Tire和嵌套查询/与ActiveRecord的关联全部内容,希望文章能够帮你解决ElasticSearch,Tire和嵌套查询/与ActiveRecord的关联所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。