1

这是模型“类”模型,我为其创建了“关键字”、“生活区”、“类型”的“文本”索引。

模型结构:

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

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

4

2 回答 2

1

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

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

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

文档报价

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

它还应该说“您不能$or$text表达式或$near运算符一起使用,其中任何一个都用于多个条件。” 但是缺少那一点信息,但您仍然无法做到。

您的语法通常不正确,但即使在受支持的 MongoDB 版本中使用正确的语法,尝试这样使用也会出现错误$or

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

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

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

  2. 忍受多个字段的索引并使用单个索引。

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

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

于 2015-07-01T12:04:31.120 回答
1

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

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

于 2015-07-01T12:07:23.720 回答