Elasticsearch with Tire on Rails 批量导入和索引问题



我有一个rails应用程序,它有一个基于Elasticsearch和Tire的全文搜索,它已经在开发一个名为Category的MongoDB模型,但现在我想添加一个基于MongoID Embedded 1-n模型的更复杂的搜索User,它嵌入了s_many:watchlists

现在我必须批量导入并索引Watchlist中的所有字段,我想知道:

  1. 我该怎么做
  2. 可以只索引观察列表的子字段,而不索引用户的父字段吗

嵌入式1-N MongoDB/MongoID模型如下所示:

app/models/user.rb(父级):

class User
include Mongoid::Document
include Tire::Model::Search
include Tire::Model::Callbacks
index_name 'users'
field :nickname
field ... many others
embeds_many :watchlists
end

app/models/watchlist.rb(嵌入式"许多"儿童):

class Watchlist
include Mongoid::Document
include Tire::Model::Search
include Tire::Model::Callbacks
index_name 'watchlists'
field :html_url
embedded_in :user
end

关于如何完成任务有什么建议吗?

更新:这是mongoshell 模型的一部分

> user = db.users.findOne({'nickname': 'lgs'})
{
"_id" : ObjectId("4f76a16cf2a6a12f88cbca43"),
"encrypted_password" : "",
"sign_in_count" : 0,
"provider" : "github",
"uid" : "1573",
"name" : "Luca G. Soave",
"email" : "luca.soave@gmail.com",
"nickname" : "lgs",
"watchlists" : [
{
"_id" : ObjectId("4f76997f1d41c81173000002"),
"tags_array" : [ git, peristence ],
"html_url" : "https://github.com/mojombo/grit",
"description" : "Grit gives you object oriented read/write access to Git repositories via Ruby.",
"fork_" : false,
"forks" : 207,
"watchers" : 1258,
"created_at" : ISODate("2007-10-29T14:37:16Z"),
"pushed_at" : ISODate("2012-01-27T01:05:45Z"),
"avatar_url" : "https://secure.gravatar.com/avatar/25c7c18223fb42a4c6ae1c8db6f50f9b?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"
},
...
...
} 

我想索引&查询嵌入的子观察列表doc:所拥有的任何字段

... "tags_array", "html_url", "description", "forks" 

但我不希望弹性搜索包含父用户字段:

... "uid", "name", "email", "nickname" 

因此,当我查询"git持久性"时,它将查看原始MongoDB的每个"用户"的每个"观察列表"索引字段。

(很抱歉这里的单数和复数不匹配,我只是指示文档对象名称)

这实际上取决于您希望如何为搜索引擎序列化数据,基于您希望如何查询它们。请更新问题,我会更新答案。(此外,最好只是删除ES日志,它们在这里不相关。)

我不知道Rake任务是如何处理Mongo中的嵌入文档的,也不知道为什么它最后似乎"挂起"了。运行任务时,您的数据是否在"用户"索引中?

请注意,当Rake任务不够灵活时,提供自己的索引代码非常容易。请参阅Tire::Index#import集成测试。

最新更新