我有一个mongodb文档,如下所示:
document
title
suburb
id
date
我想添加一个搜索功能,人们可以通过郊区和标题搜索文档。我正在使用文本搜索功能,我想要这样的东西:
var search = {
$and : [
{ $search:'melbourne' }, // Search in suburb
{ $search:'hello world' } // As well as in title
]
};
db.ad.find(search).sort([['date', -1]]).limit(10).skip(0, callback);
但上面的代码不起作用。我已经将郊区和标题字段编入索引并启用了文本搜索。
有谁知道如何制作支持两个不同领域的文本搜索的mongodb子句?
我在mongodb v 2.6上使用mongojs
答案 0 :(得分:4)
"文本搜索" mongodb中的概念并不像那样。相反,这里的概念是你定义"多个字段"在"text index"中,只搜索条款。
让我们说你有"东西"像这样:
{ "_id" : ObjectId("55ba22294bde97b581332979"), "title" : "Hello there" },
{ "_id" : ObjectId("55ba22414bde97b58133297a"), "title" : "Hello world" },
{
"_id" : ObjectId("55ba22594bde97b58133297b"),
"title" : "Hello world",
"suburb" : "melbourne"
}
然后我决定创建一个这样的文本索引:
db.junk.createIndex(
{ "title": "text", "suburb": "text" },
{ "weights": { "title": 10 } }
)
然后我使用$text
进行搜索:
db.junk.find(
{ "$text": { "$search": "Hello World Melbourne" } },
{ "score": { "$meta": "textScore" } }
).sort({ "score": { "$meta": "textScore" } })
结果如下:
{
"_id" : ObjectId("55ba22594bde97b58133297b"),
"title" : "Hello world",
"suburb" : "melbourne",
"score" : 11.5
},
{
"_id" : ObjectId("55ba22414bde97b58133297a"),
"title" : "Hello world",
"score" : 1.5
},
{
"_id" : ObjectId("55ba22294bde97b581332979"),
"title" : "Hello there",
"score" : 1
}
哪个"两个"搜索索引中指定的所有字段,并考虑额外的"权重"给予"郊区"在这种情况下,使其成为更受欢迎的排名。
所以你不能使用额外的条件,你可以使用" all" " one"中的条款文本查询字符串,用于搜索多个字段。
答案 1 :(得分:0)
如果要在多个字段上应用文本搜索,则无法使用您的解决方案。为此,您需要创建多个索引并将多个字段声明为“text”。
完成如下:
db.yourcollectionname.ensureIndex({field1:"text",field2:"text", ...})
然后运行查询查询:
db.yourcollectionname.find({$text:{$search:"keywords"}})
如果您的文字搜索仍然不起作用,我发现这篇文章非常有帮助 http://codewhoop.com/article/MongoDb%20Text%20Search%20in%20fields%20of%20document
它包含您需要遵循的所有步骤,成功运行文本搜索查询,并根据相关性对结果进行排序。希望它可以帮助您:)