当前位置: 首页 > news >正文

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"})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • react页面指定dom转pdf导出
  • 网络通信介绍
  • css3 中的伪类和伪元素
  • 数学建模-Topsis(优劣解距离法)
  • Node.js实现文件下载
  • 记录些MySQL题集(15)
  • idea Apipost 插件导出接口文档字段类型全部是string
  • webpack和vite
  • (算法)区间调度问题
  • electron 的nsis配置
  • myeclipse开发ssm框架项目图书管理系统 mysql数据库web计算机毕业设计项目
  • 高数知识补充----矩阵、行列式、数学符号
  • 『 Linux 』简单日志插件
  • IDEA自带的Maven 3.9.x无法刷新http nexus私服
  • Ubuntu 24.04安装Jellyfin媒体服务器图解教程
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android优雅地处理按钮重复点击
  • css布局,左右固定中间自适应实现
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java方法详解
  • leetcode98. Validate Binary Search Tree
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Octave 入门
  • PHP那些事儿
  • Redis 懒删除(lazy free)简史
  • Shell编程
  • SpiderData 2019年2月16日 DApp数据排行榜
  • V4L2视频输入框架概述
  • 基于组件的设计工作流与界面抽象
  • 开源地图数据可视化库——mapnik
  • 前端
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 一文看透浏览器架构
  • 大数据全解:定义、价值及挑战
  • 交换综合实验一
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​520就是要宠粉,你的心头书我买单
  • # Redis 入门到精通(七)-- redis 删除策略
  • #数学建模# 线性规划问题的Matlab求解
  • (02)vite环境变量配置
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3) cmake编译多个cpp文件
  • (HAL库版)freeRTOS移植STMF103
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (函数)颠倒字符串顺序(C语言)
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (译)2019年前端性能优化清单 — 下篇
  • .DFS.
  • .net MySql
  • .NET和.COM和.CN域名区别
  • .Net中间语言BeforeFieldInit