在Rails中使用动态属性时,如何在mongo id中实现通用搜索

时间:2019-02-26 12:30:39

标签: ruby-on-rails mongodb mongoid

我有一个名为Example的集合,集合的所有字段都是动态的。我想执行常见搜索。我不知道该怎么办。例如,如果我搜索“ hello”,它将返回一个包含名称的集合的所有对象,而与包含值的字段无关。

示例:

{ id: 111234, desc: 'hello world' },     
{ id: 545ttt, title: 'hello title' }, 
{ id: sfsd3, data: 'hello' }

如果我打招呼,我的查询应该返回上述所有记录。 我找到了mongoid_search宝石,但没有找到与动态字段搜索相关的任何内容。

谢谢。

2 个答案:

答案 0 :(得分:3)

第1步。在所有字段上创建一个text index

db.collection.createIndex({ "$**": "text" },{ name: "TextIndex" })

第2步。您可以使用$text作为以下查询对象进行简单的文本搜索:

{ $text : { $search: <your string> } }

答案 1 :(得分:1)

您还可以创建一个“虚拟字段”,其中包含所有字符串字段的串联内容。然后将其与mongoid_search一起使用:

search_in :search_data

def search_data
  self.attributes.select{|k,v| v.is_a?(String) }.values.join(' ')
end

这是如何工作的:mongoid_search gem在每次保存之前运行search_data方法,并使用其输出来填充(隐藏)_keywords字段。然后,当您执行YourModel.full_text_search('hello')之类的操作时,此字段将用于实际搜索。