如何在 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 中插入 JSON 数组
node.js,mongodb,mongoose,html 我如何插入数据(在 index.html 中)?
如何在 Mongoose(MongoDB 包装器)中删除一行 [重复]