我有一个名为Example的集合,集合的所有字段都是动态的。我想执行常见搜索。我不知道该怎么办。例如,如果我搜索“ hello”,它将返回一个包含名称的集合的所有对象,而与包含值的字段无关。
示例:
{ id: 111234, desc: 'hello world' },
{ id: 545ttt, title: 'hello title' },
{ id: sfsd3, data: 'hello' }
如果我打招呼,我的查询应该返回上述所有记录。 我找到了mongoid_search宝石,但没有找到与动态字段搜索相关的任何内容。
谢谢。
答案 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')
之类的操作时,此字段将用于实际搜索。