MongoDB如何实现name字段多关键词AND匹配的文本查询,替代默认OR逻辑
MongoDB 文本搜索多关键词全匹配实现指南
你执行
{"$text":{$search:'computer dummy'}}能命中示例文档,是MongoDB全文搜索的默认规则导致的:空格分隔的多关键词默认走OR匹配,只要文档任意命中一个关键词就会返回,不符合你需要「name字段包含全部指定值」的AND匹配需求。
单纯实现多关键词全匹配的需求,不需要专门写$and运算符列表拼接多个查询条件,MongoDB原生的$text语法本身就支持AND匹配能力,常用实现方式如下:
- 匹配所有任意顺序的关键词:给每个要求必须命中的关键词前置
+符号,查询语句示例:
这种写法下,只有name字段同时包含db.getCollection('test').find({"$text":{$search:'+computer +dummy'}})computer和dummy两个关键词的文档才会被返回,你给出的示例文档因为没有dummy关键词,不会被命中,完全贴合需求。 - 匹配连续出现的固定短语:把整段需要匹配的短语用英文双引号包裹,比如要精准匹配
mini computer这段连续文本,查询写为:db.getCollection('test').find({"$text":{$search:'"mini computer"'}})
只有当你需要在「全关键词文本匹配」的基础上,叠加其他额外筛选规则(比如同时要求
nb字段值大于1),才需要用$and把$text查询和其他普通查询条件拼接,示例:db.getCollection('test').find({ $and: [ {"$text":{$search:'+computer +dummy'}}, {"nb": {$gt: 1}} ] })
注意:使用$text搜索的前提,是你已经提前为
name字段创建了文本索引,创建语句为:db.test.createIndex({name: "text"})
如果你的集合数据量不大,没必要专门创建文本索引,也可以用正则方式实现多关键词全包含匹配,不需要额外索引:
db.getCollection('test').find({"name": {$regex: /(?=.*computer)(?=.*dummy)/i}})
这种写法适合小数据量的临时检索场景,数据量较大时性能远低于文本索引方案。
内容的提问来源于stack exchange,提问作者michel46
相关产品推荐
相关产品推荐

