Mongodb文本索引

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第94篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。威赞文章都是结合官方文档,翻译整理而来,并对每个知识点的描述都认真思考和实践,对难以理解的地方,使用简单容易理解的方式进行阐述。

本文结合Mongodb的官方文档,整理文本索引的内容。思考这样的应用场景。在一家服装为主营业务的电商平台上,集合clothing包含了商品的描述信息。用户想要查找用丝绸制作的衣服,在商品描述信息上建立一个文本索引,并使用silk作为关键字查询商品的描述信息。该查询返回了描述当中带有丝绸的文档数据。

概述

文本索引,能够支持保存字符串字段的文本查询。文本索引,提高了基于单个词语或短语的查询性能。一个集合中,只能有一个文本索引,但该文本索引可以包含多个字段。

使用下面的语法来向集合中添加文本索引

复制代码
db.<collection>.createIndex(
  {
    <field1>: "text",
    <field2>: "text",
    ...
  }
)

文本索引,支持使用text操作符,查询用户自己搭建的Mongodb服务器。但用户在使用text时,必须添加文本索引。

使用限制

复合文本索引

复合文本索引是包含一个文本索引键和一个其他索引类型构成的索引,该索引中,只有文本索引决定了该索引和哪个文档关联。其他索引类型的键,不能够决定关联哪一个文档。

复合文本索引,不能包含其他特殊类型的文本索引。如不能和多键索引,地理信息索引共同使用。

当使用复合文本索引字段查询时,使用$text操作符时,查询条件中必须包含一个等值查询条件。

创建复合文本索引时,文本索引类型的字段必须要排列在一起。

稀疏属性

文本索引默认是稀疏的。当用户插入一个不包含文本索引字段的新文档时,mongodb不会为该文档添加文本索引。

存储要求和性能消耗

  • 文本索引会消耗大量的内存。文本索引几乎包含新插入文档文本字段的每一个单词。
  • 构建文本索引的过程类似构建大的多键索引,但相同规模的数据量,文本索引构建花费更多时间。
  • 因为构建文本索引要消耗大量的内存,所以要保证操作系统有足够的文件打开限制数量。
  • 文本索引影响写操作性能,因为mongodb必须为新插入文档文本数据的每一个单词添加到索引中。
  • 文本索引保存的是每一个单词,不保存文档数据中复杂的短语或句子成分,因此,当整个集合都加载到内存当中时,多个单词的查询才会执行的更快。

数量限制

每一个集合,只能有一个文本索引

Hints

包含文本索引的查询语句,不能使用hint指定查询使用的索引。

排序性能

文本索引,不能够提高排序操作的性能。

字符序

文本索引,只支持二进制比较,不支持字符序选项。当用户使用其他字符序创建集合时,为该集合添加文本索引,必须指定简单字符序。

复制代码
db.createCollection(
  "collectionTest", 
  {
    collation: {locale: "en"}
  }
)

db.collectionTest.createIndex(
  {
    quotes: "text"
  }, 
  {
    collation: {locale: "simple"}
  }
)

数据库版本

不同版本的数据支持文本索引版本不同。下表描述了不同数据库版本和索引版本的对应关系。

|--------|------------------|
| 文本索引版本 | 描述 |
| 版本3 | mongodb 3.2版本或以后 |
| 版本2 | mongodb2.6到3.0 |
| 版本1 | mongodb 2.4 |

用户添加文本索引时,用下面的语法指定默认的文本索引版本

复制代码
db.<collection>.createIndex(
  {
    <field>: "text"
  }, 
  {
    "textIndexVersion": <version>
  }
)

这里列举了一个版本2的应用方式

复制代码
db.test.createIndex(
  {
    "content": "text"
  }, 
  {
    "textIndexVersion": 2
  }
)

应用

构建集合blog并插入数据

复制代码
db.blog.insertMany([
    { 
        _id: 1, 
        content: "This is a blog post about MongoDB",
        about:  "MongoDB",
        keywords: ["MongoDB", "database", "NoSQL"]
    },
    { 
        _id: 2, 
        content: "This is a blog post about MongoDB and Python",
        about:  "MongoDB",
        keywords: ["MongoDB", "Python"]
    },
    { 
        _id: 3, 
        content: "This is a blog post about NoSQL databases",
        about:  "NoSQL",
        keywords: ["NoSQL", "database"]
    }
])

为blog集合添加文本索引

复制代码
db.blog.createIndex({content: "text"})

使用文本索引查询

复制代码
db.blog.find({$text: {$search: "MongoDB"}})

删掉文本索引,并创建一个复合索引

复制代码
db.blog.dropIndex("content_text")

db.blog.createIndex({content: "text", about: "text", keywords: "text"})
相关推荐
smppbzyc1 分钟前
2025年亚太杯(中文赛项)数学建模B题【疾病的预测与大数据分析】原创论文讲解(含完整python代码)
python·数学建模·数据分析·数学建模竞赛·亚太杯数学建模·亚太杯
xiaocainiao88113 分钟前
Python 实战:构建可扩展的命令行插件引擎
开发语言·python
运器1231 小时前
【一起来学AI大模型】PyTorch DataLoader 实战指南
大数据·人工智能·pytorch·python·深度学习·ai·ai编程
音元系统1 小时前
Copilot 在 VS Code 中的免费替代方案
python·github·copilot
超龄超能程序猿1 小时前
(5)机器学习小白入门 YOLOv:数据需求与图像不足应对策略
人工智能·python·机器学习·numpy·pandas·scipy
cooldream20093 小时前
Python 包管理新时代:深入了解 `uv` 的使用与实践
python·uv·包管理器
之歆3 小时前
Python-魔术方法-创建、初始化与销毁-hash-bool-可视化-运算符重载-容器和大小-可调用对象-上下文管理-反射-描述器-二分-学习笔记
笔记·python·学习
胖达不服输4 小时前
「日拱一码」025 机器学习——评价指标
人工智能·python·机器学习·评价指标
brave_zhao5 小时前
JavaBeanUtils javaBean转map, 实体类转map,实体集合转List<Map>
linux·windows·python
行走在云端z6 小时前
mongodb 开源同步工具介绍
数据库·mongodb·开源