我试图创建一个查询,找到符合条件的文档集合,一个简单的搜索系统。问题是集合中的资产是这样的:
{
fristName: "foo",
lastName: "bar",
description: "mega foo",
},
{
fristName: "Lorem",
lastName: "Ipsum",
description: "mega Lorem bla bla",
},
如果用户想要包含单词 bar 的所有资产,我应该显示示例的资产1,这不是问题,但如果他输入了 foo mega < / em>?,在这种情况下我还需要显示资产1,因为 foo 和 mega 存在于资产1(两者都是)中,如果他只搜索< em> mega ,输出是资产1和2,如果他搜索mega ipsum,结果是资产2.我不知道如何在mongoDb中编写此查询。
答案 0 :(得分:3)
Mongodb 2.6+内置支持使用$text
运算符进行文本搜索。以下是如何使用它。
在所需的可搜索字段上构建文本索引。注意:对于MongoDB 2.6,集合上只能有1个文本索引。
在一个字段上创建文本索引
db.test.ensureIndex({
"field1" : "text"
}, { name : "Field1TextIndex"});
在两个字段上创建文本索引
db.test.ensureIndex({
"field1" : "text",
"field2" : "text"
}, { name : "Field12TextIndex"});
为任何字符串字段创建文本索引
db.test.ensureIndex({
"$**" : "text"
}, { name : "AllTextIndex"});
使用$ text运算符查询集合。
以下是$text
{ $text: { $search: <string of keywords>, $language: <string> } }
use test;
var createPerson = function(f,l,d){
return { firstName : f, lastName: l, description : d};
};
db.test.remove({});
db.test.insert(createPerson("Ben", "Dover", "Real Estate Agent"));
db.test.insert(createPerson("James", "Bond", "secret agent, ben's friend"));
db.test.ensureIndex({ "$**" : "text" }, { name : "AllTextIndex"});
正在搜索ben
db.test.find({
$text : {
$search : "ben"
}
});
{ "_id" : "...", "firstName" : "James", "lastName" : "Bond", "description" : "secret agent, ben's friend" }
{ "_id" : "...", "firstName" : "Ben", "lastName" : "Dover", "description" : "Real Estate Agent" }
对“ben”的搜索返回了两个文档,因为Ben
为firstName
,另一个ben's
字段为description
。
查询real friend
会产生相同的结果。
db.test.find({
$text : {
$search : "real friend"
}
});
更多信息:
答案 1 :(得分:2)
可能的解决方案是通过关键字进行搜索。我的意思是你必须为每个对象添加keywords
字段,例如:
{
fristName: "foo",
lastName: "bar",
description: "mega foo",
keywords: ["foo", "bar", "mega"]
},
{
fristName: "Lorem",
lastName: "Ipsum",
description: "mega Lorem bla bla",
keywords: ["mega", "Lorem", "Ipsum", "bla"]
},
您必须将请求字符串拆分为关键字,例如
"foo mega"
将转换为
["foo", "mega"]
然后您可以按keywords
字段搜索对象。