MongoDB - 文本索引
MongoDB 是一个基于文档的 NoSQL 数据库。由于数据以文档格式存储,因此可以容纳大量数据,并且由于它是 NoSQL 数据库类型,因此没有严格的参照完整性关系。因此,搜索是这里的一个重要标准,为此 MongoDB 提供了文本索引来支持文本搜索查询,尤其是对字符串内容的查询。文本索引应该是字符串或字符串元素数组。
如何创建文本索引?
在 MongoDB 中,我们可以使用 db.collectionName.createIndex() 方法创建文本索引。因此,要索引包含字符串或字符串元素数组的字段,请在 createIndex() 方法中传递包含字段和字符串字面量(即“文本”)的文档。使用此方法,您可以为文本索引索引多个字段。此外,复合索引可以包含文本索引键以及升序和降序索引键。如果您想删除文本索引,只需使用索引名称。
句法:
db.collectionName.createIndex( { field: “text” } )
例子:
Database: ggf
Collection: studentsposts
Documents: Two documents
现在,让我们在“studentsposts”集合的“title”字段上创建一个文本索引,以便在集合内进行搜索。
db.studentsposts.createIndex({title: "text"})
现在我们将看到如何使用文本索引进行搜索:
db.studentsposts.find({$text:{$search: "mongodb"}}).pretty()
上面的输出是不言自明的,因为我们在“title”字段上创建了索引,并且我们尝试搜索文本“mongodb”。它存在于“标题”字段中的两个文档中。因此,这里的结果是 2 个文档。
掉落指数
有时也可能需要删除文本索引,因为它被错误地创建或需要以不同的方式修改或完全想删除它。因此,使用db.collection.dropIndex()方法我们可以删除文本索引。此方法从给定的集合中删除指定的索引。
句法:
db.collection.dropIndex("TextIndex")
例子:
首先,我们找到字段的索引。
db.studentsposts.getIndexes()
现在我们使用 dropIndex() 方法删除文本索引。
db.studentsposts.dropIndex("title_text")
指定权重
对于文本索引,索引字段的权重就是该字段的重要性。在 MongoDB 中,对于文档中的每个索引字段,MongoDB 通过将匹配数乘以权重来对结果求和。现在使用这个总和,MongoDB 计算文档的分数。索引字段的默认权重为 1,您可以使用 createIndex() 方法调整索引的权重。
例子:
db.studentsposts.createIndex({title:"text", tags:"text"},
{weights:{title:10, tags:5},
name:"TextIndex"})
此处,标题和标签字段的权重分别为 10 和 5。
通配符索引
使用通配符说明符($**),您可以创建多个文本索引字段。由于通配符文本索引,MongoDB 对给定集合中存在的所有文档中保存字符串数据的每个字段进行索引。通配符文本索引对于我们不知道哪个字段包含字符串数据或临时查询的非结构化数据很有用。它允许在包含字符串数据的所有字段上搜索文本。野生文本索引可以是复合索引的一部分。
例子:
db.studentsposts.createIndex( { "$**": "text" } )
在这里,我们使用通配符说明符创建文本索引。
现在,我们将看到 studentposts 集合中存在的所有索引。
限制
- 每个集合最多允许一个文本索引
- 使用 $text 查询表达式,我们不能使用hint()
- 文本索引和排序不能一起提供所需的结果。排序操作不能使用文本索引中的排序。
- 复合索引不能包含多键或地理空间索引字段。