Mongodb文本搜索多个字段

时间:2015-07-30 12:30:37

标签: node.js mongodb mongojs

我有一个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

2 个答案:

答案 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

它包含您需要遵循的所有步骤,成功运行文本搜索查询,并根据相关性对结果进行排序。希望它可以帮助您:)