如何在 mongodb / mongoose 中使用“$text query and $or”进行多文本搜索?

Posted

技术标签:

【中文标题】如何在 mongodb / mongoose 中使用“$text query and $or”进行多文本搜索?【英文标题】:How to do multiple text search using "$text query and $or" in mongodb / mongoose? 【发布时间】:2015-09-18 13:29:43 【问题描述】:

这是模型 'Class' 模型,我为它创建了 'keywords'、'lifeArea'、''type' 的“文本”索引。

模型结构:


    "_id" : ObjectId("558cf6e3387419850d892712"),
    "keywords" : "rama,seetha",
    "lifeArea" : [
        "Emotional Wellness"
    ],
    "type" : "Pre Recorded Class",
    "description" : "ram description",
    "synopsis" : "ram syn",
    "name" : "ram demo",
    "__v" : 0


db.Class.getIndexes() 
// displaying index

        "v" : 1,
        "key" : 
            "_fts" : "text",
            "_ftsx" : 1
        ,
        "name" : "classIndex",
        "ns" : "innrme.classes",
        "weights" : 
            "keywords" : 1,
            "lifeArea" : 1,
            "type" : 1
        ,
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 2

我想对上述字段进行文本搜索。我尝试了以下查询。

db.classes.find($or:[keywords:  $text:  $search: "rama abc"   , type: $text:  $search: "class" ],score: $meta: 'textScore');

但它不起作用,我得到了以下错误

Error: error: 
    "$err" : "Can't canonicalize query: BadValue unknown operator: $text",
    "code" : 17287

请帮助我获得正确的查询。 如果我在提出问题或解释问题时有错误,请纠正/教育我

【问题讨论】:

【参考方案1】:

该实际错误表明您的 mongodb 版本低于 2.6(因此无法以这种方式进行文本搜索)。但无论如何你都不能这样做,原因有两个。

    $or 表达式只能有 一个 特殊索引表达式,在参数中可以是“文本”或“地理空间”。

    您希望在“两个”不同的字段上进行文本搜索,并且每个集合只能有 一个 文本索引。但是,该单个索引可以分布在文档中的多个字段中。但是您不能针对不同的字段要求不同的搜索词。

文档quote:

您不能将需要特殊文本索引的 $text 表达式与需要不同类型的特殊索引的查询运算符结合使用。例如,您不能将 $text 表达式与 $near 运算符结合使用。

它还应该说“你不能将$or$text 表达式或$near 运算符一起用于多个条件。”信息丢失了,但你还是做不到。

您的语法通常不正确,但即使在受支持的 MongoDB 版本中使用正确的语法,您在尝试使用 $or 时也会遇到错误,如下所示:

Error: error: 
    "$err" : "Can't canonicalize query: BadValue Too many text expressions",
    "code" : 17287

所以要解决这个问题,你需要:

    拥有支持$text语法(或使用命令形式)的2.6或更高版本的MongoDB服务器

    适应多个字段的索引并使用单个索引。

    执行“单独查询”代替“或”条件,并在客户端 API 接口中“组合”结果。

这是使用 MongoDB 文本搜索获得类似“或”条件的唯一方法。

【讨论】:

【参考方案2】:

首先,我认为您不能以这种方式使用$text,您需要首先在集合上创建一个文本索引,然后您可以使用它但不指定任何字段,因为它适用于索引而不是字段。

请在此处查看:http://docs.mongodb.org/manual/administration/indexes-text/

【讨论】:

以上是关于如何在 mongodb / mongoose 中使用“$text query and $or”进行多文本搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地连接mongoose到mongodb

如何使用 Mongoose 在 MongoDB 中插入 JSON 数组

node.js,mongodb,mongoose,html 我如何插入数据(在 index.html 中)?

如何在 Mongoose(MongoDB 包装器)中删除一行 [重复]

如何在运行 Mongodb 的 Mongoose 中执行脚本?

如何在 mongoose 和 mongodb 中更新嵌套模型