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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用SpringBoot集成Swagger3.0实现在线接口文档功能

概述 Swagger 3.0 是一个开源的框架&#xff0c;用于设计、构建和文档化 RESTful API。它允许开发者定义 API 规范&#xff0c;包括请求、响应、端点等信息&#xff0c;并生成交互式 API 文档。Knife4j 则是 Swagger 的一个增强版本&#xff0c;提供了更美观和功能丰富的界面。…

人工智能导论-专家系统

专家系统 概述 本章主要介绍专家系统的概念、原理&#xff0c;创建过程&#xff0c;并补充知识发现与数据挖掘内容 **重点&#xff1a;**专家系统的工作原理和体系结构,知识获取的过程和模式 **难点&#xff1a;**如何设计和创建专家系统 AI第2次高峰(60年代) - 费根鲍姆 …

Pytest 框架快速入门

Pytest 框架常用功能介绍 一、简介 Pytest 是一个功能强大的 Python 测试框架&#xff0c;具有简单易用、测试用例清晰易读、支持参数化、可运行由 Nose 和 unittest 编写的测试用例、拥有丰富的第三方插件且可自定义扩展、支持重复执行失败的用例以及方便与持续集成工具集成…

rabbitmq为什么在不超过30MB时,延迟比kafka低很多,为什么超过30MB,在延迟上又不如kafka

前言 RabbitMQ 和 Kafka 是两种常用的消息队列系统&#xff0c;它们在不同场景下有不同的性能表现。在讨论 RabbitMQ 和 Kafka 在不同消息大小下的延迟和性能表现时&#xff0c;需要了解它们各自的架构和设计理念 RabbitMQ 和 Kafka 的基本架构和设计理念 RabbitMQ&#xff…

Flutter动画详解第二篇之显式动画(Explicit Animations)

目录 前言 一、定义 1.AnimationController 1.常用属性 1. value 2. status 3. duration 2.常用方法 1.forward 2.reverse 3.repeat 4.stop 5. reset 6. animateTo(double target, {Duration? duration, Curve curve Curves.linear}) 7.animateBack(double ta…

C# 智慧大棚nmodbus4

窗体 &#xff1a;图表&#xff08;chart&#xff09;&#xff1a; 下载第三方&#xff1a; nmodbus4:可以实现串口直连&#xff0c;需要创建串口对象设置串口参数配置Serialport 如果需要把串口数据表通过tcp进行网口传递 需要创建tcpclient对象 ModbusSerialMaster master; /…

ConcurrentHashMap第1讲——哪些地方做了并发控制

我们知道在多线程环境下&#xff0c;HashMap在初始化桶数组、put桶、插入链表以及树化等阶段都有线程安全问题&#xff0c;在jdk1.5之前我们通常用HashTable或Collections.synchronizedMap包装过的HashMap来保证线程安全&#xff0c;不过它们在执行任何操作时都需要锁住整个has…

UNIX中sigaction和sigevent有啥区别

sigaction和sigevent在UNIX和类UNIX系统&#xff08;如Linux&#xff09;的信号处理机制中扮演着不同的角色。 sigaction 功能&#xff1a; sigaction是一个用于查询或设置信号处理方式的函数。它允许进程为特定的信号指定一个信号处理函数&#xff0c;以及设置信号处理时的其…

MyPostMan 迭代文档管理、自动化接口闭环测试工具(自动化测试篇)

MyPostMan 是一款类似 PostMan 的接口请求软件&#xff0c;按照 项目&#xff08;微服务&#xff09;、目录来管理我们的接口&#xff0c;基于迭代来管理我们的接口文档&#xff0c;文档可以导出和通过 url 实时分享&#xff0c;按照迭代编写自动化测试用例&#xff0c;在不同环…

kubernetes--Istio(四)

一、可观测性 Istio 为网格内所有的服务通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观测性&#xff0c; 使运维人员能够排查故障、维护和优化应用程序&#xff0c;而不会给服务的开发人员带来任何额外的负担。 通过 Istio&#xff0c;运维人员可以全面了解到受监…

【React】创建React项目:使用 create-react-app 创建 React 应用

在本文中&#xff0c;我们将介绍如何使用 create-react-app 创建一个名为 react-basic 的 React 应用。以下步骤将帮助你快速搭建一个新的 React 项目。 1. 确保已安装 Node.js 和 npm 在开始之前&#xff0c;确保你的系统上已经安装了 Node.js 和 npm&#xff08;Node 包管理…

Burp安全扫描Web应用

一、浏览器设置代理 如下图所示&#xff0c;点击火狐浏览器的“扩展和主题”&#xff0c;搜索“代理”。 如下图所示&#xff0c;选择搜索到的第一个代理&#xff08;选择任何一个都可以&#xff09;。 如上图所示&#xff0c;第一个点击后&#xff0c;进入如下页面&#xff0…

在 Electron 中,主进程和渲染进程之间有多种通信方式

在 Electron 中&#xff0c;主进程和渲染进程之间有多种通信方式。以下列出了其中几种&#xff1a; 1. ipcMain 和 ipcRenderer&#xff1a;使用主进程和渲染进程之间的 Electron 网络协议 (ipc) 模块来发送事件和消息。这是一种双向通信的方式&#xff0c;可以实现消息的传递…

opencv—常用函数学习_“干货“_11

目录 二九、图像累加 将输入图像累加到累加图像中 (accumulate) 将输入图像加权累加到累加图像中 (accumulateWeighted) 将输入图像的平方累加到累加图像中 (accumulateSquare) 将两个输入图像的乘积累加到累加图像中 (accumulateProduct) 解释 三十、随机数与添加噪声 …

【Access、Trunk和Hybrid】

概述 Access类型的端口只能属于1个VLAN&#xff0c;一般用于连接计算机的端口&#xff1b;Trunk类型的端口可以允许多个VLAN通过&#xff0c;可以接收和发送多个VLAN的报文&#xff0c;一般用于交换机之间连接的端口&#xff1b;Hybrid类型的端口可以允许多个VLAN通过&#xf…

自己编写一个谷歌浏览器插件, 模拟某音直播间自动发消息

闲来没事&#xff0c; 做个插件玩一玩&#xff0c;于是一顿学习。 按照浏览器插件规范&#xff0c;一顿代码编写&#xff0c; 搞了一个简单的插件。仅做学习。 可以实现在直播间自动发消息。 定时轮发。 实现原理&#xff1a; 利用谷歌popub.js 发送消息。 在content-script.…

leetcode-49. 字母异位词分组

题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "n…

g2plot如何实现面积图和折线图的动态切换?

一开始的时候显示的是面积图&#xff1a; 当我点击折线图的时候&#xff0c;要变成折线图&#xff1a; 当我再点击面积图的时候&#xff0c;还要变回面积图&#xff1a; 要实现这个功能&#xff0c;得知道g2plot几个重要的API。 参考文档如下&#xff1a;https://g2plot…

【python】网络通信socket

一、什么是socket socket网络通信是一种基于TCP/IP协议的通信方式&#xff0c;通过套接字&#xff08;Socket&#xff09;实现不同主机间的通信。它基于客户端-服务器架构&#xff0c;客户端和服务器通过Socket进行连接、通信和数据交换。在网络中&#xff0c;进程之间如何通信…