如何在 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 的版本(因此无法以这种方式进行文本搜索)。但无论如何你不能这样做,原因有二。
一个$or
表达式只能有一个特殊索引表达式,可以是"text" 或参数中的 "geospatial"。
您希望在 "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
}
因此,要解决此问题,您需要:
拥有支持 $text
语法(或使用命令形式)的 MongoDB 服务器版本 2.6 或更高版本
忍受在多个字段上建立索引并使用单个索引。
执行 "separate queries" 代替您的 "or" 条件和 "combine" 客户端 API 界面中的结果。
这是通过 MongoDB 文本搜索获得 "or" 条件的唯一方法。
首先,我认为您不能以这种方式使用 $text
,您需要先在集合上创建一个文本索引,然后您可以使用它,但无需指定任何字段,因为它适用于索引不是字段。
请在此处查看:http://docs.mongodb.org/manual/administration/indexes-text/
这是我为 '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 的版本(因此无法以这种方式进行文本搜索)。但无论如何你不能这样做,原因有二。
一个
$or
表达式只能有一个特殊索引表达式,可以是"text" 或参数中的 "geospatial"。您希望在 "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
}
因此,要解决此问题,您需要:
拥有支持
$text
语法(或使用命令形式)的 MongoDB 服务器版本 2.6 或更高版本忍受在多个字段上建立索引并使用单个索引。
执行 "separate queries" 代替您的 "or" 条件和 "combine" 客户端 API 界面中的结果。
这是通过 MongoDB 文本搜索获得 "or" 条件的唯一方法。
首先,我认为您不能以这种方式使用 $text
,您需要先在集合上创建一个文本索引,然后您可以使用它,但无需指定任何字段,因为它适用于索引不是字段。
请在此处查看:http://docs.mongodb.org/manual/administration/indexes-text/