栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

ElasticSearch,Tire和嵌套查询/与ActiveRecord的关联

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ElasticSearch,Tire和嵌套查询/与ActiveRecord的关联

Tire中对ActiveRecord关联的支持正在起作用,但是需要在应用程序内部进行一些调整。毫无疑问,图书馆应该在这里做得更好,将来肯定会做得更好。

就是说,这是一个可以在Elasticsearch中与Rails的关联一起工作的Tire配置的完整示例:active_record_associations.rb

让我在这里强调几件事。

父模型

首先,必须确保将关联的更改通知关联的父模型。

给定我们有一个

Chapter
模型“属于” a
Book
,我们需要做:

class Chapter < ActiveRecord::base  belongs_to :book, touch: trueend

这样,当我们执行以下操作时:

book.chapters.create text: "Lorem ipsum...."

book
实例被通知增加的一章。

响应触摸

整理完这一部分后,我们需要将有关更改通知给 Tire ,并相应地更新elasticsearch索引:

class Book < ActiveRecord::base  has_many :chapters  after_touch() { tire.update_index }end

(毫无疑问, Tire
应该

after_touch
自行拦截通知,而不是强迫您这样做。这是另一方面,证明了绕过图书馆的限制以不伤眼睛的方式进行工作有多么容易)

在Rails <3.1中正确进行JSON序列化

尽管自述文件中提到您必须在Rails <3.1中禁用自动的“在JSON中添加根密钥”,但许多人还是忘记了它,因此您也必须在类定义中包括它:

self.include_root_in_json = false

elasticsearch的正确映射

现在是我们工作的重点-为我们的文档(模型)定义适当的映射:

mapping do  indexes :title,      type: 'string', boost: 10, analyzer: 'snowball'  indexes :created_at, type: 'date'  indexes :chapters do    indexes :text, analyzer: 'snowball'  endend

请注意,我们

title
使用
created_at
了相关模型的升序索引(作为“日期”)和章节文本。在Elasticsearch中,所有数据都有效地“归一化”为单个文档(如果这样的话会稍微有意义)。

正确的文档JSON序列化

作为最后一步,我们必须正确地序列化Elasticsearch索引中的文档。注意我们如何利用 ActiveRecord中 的便捷

to_json
方法:
__

def to_indexed_json  to_json( include: { chapters: { only: [:text] } } )end

设置好所有这些设置之后,我们就可以在文档的

Book
Chapter
部分中搜索属性。

请运行开头链接的Ruby文件active_record_associations.rb,以查看完整图片。

有关更多信息,请参考以下资源:

  • https://github.com/karmi/railscasts-episodes/commit/ee1f6f3
  • https://github.com/karmi/railscasts-episodes/commit/03c45c3
  • https://github.com/karmi/tire/blob/master/test/models/active_record_models.rb#L10-20


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号