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

How to do multiple text search using "$text query and $or" in mongodb / mongoose?

这是我为 'keywords'、'lifeArea'、''type'.[=14 创建了 "text" 索引的模型 'Class' 模型=]

模型结构:

{
    "_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
}

请帮助我获得正确的查询。 如果我提出问题或解释问题有误,请correct/educate我

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

  1. 一个$or表达式只能有一个特殊索引表达式,可以是"text" 或参数中的 "geospatial"。

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

文档 quote

You cannot combine the $text expression, which requires a special text index, with a query operator that requires a different type of special index. For example you cannot combine $text expression with the $near operator.

而且还应该说"You cannot use $or with a $text expression or the $near operator where either are used in more than one condition."但是少了那条信息,你还是做不到

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

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

因此,要解决此问题,您需要:

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

  2. 忍受在多个字段上建立索引并使用单个索引。

  3. 执行 "separate queries" 代替您的 "or" 条件和 "combine" 客户端 API 界面中的结果。

这是通过 MongoDB 文本搜索获得 "or" 条件的唯一方法。

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

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