【问题标题】:Mongodb text search multiple fieldsMongodb文本搜索多个字段
【发布时间】:2017-01-22 23:13:59
【问题描述】:

我有一个如下所示的 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

【问题讨论】:

    标签: node.js mongodb mongojs


    【解决方案1】:

    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
    }
    

    “both”搜索索引中指定的所有字段,并考虑在这种情况下赋予“郊区”字段的额外“权重”,以使其成为更受欢迎的排名。

    因此,您不要在术语中使用附加条件,而是将“所有”术语放在“一个”文本查询字符串中以搜索多个字段。

    【讨论】:

    • 谢谢 - 如果文本索引仍然允许人们在特定字段上进行搜索,我发现的其他答案并不明确。我怀疑不是,但谢谢你说清楚。
    【解决方案2】:

    如果您想在多个字段上应用文本搜索,您的解决方案将不起作用。为此,您需要创建多个索引并将多个字段声明为“文本”。

    它是这样完成的:

    db.yourcollectionname.ensureIndex({field1:"text",field2:"text", ...})
    

    然后将查找查询运行为:

    db.yourcollectionname.find({$text:{$search:"keywords"}})
    

    如果你的文本搜索仍然不起作用,我发现这篇文章很有帮助 http://codewhoop.com/article/MongoDb%20Text%20Search%20in%20fields%20of%20document

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2021-05-16
      • 2018-03-10
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多