MongoDB是领先的NoSQL数据库之一,以其快速的性能,灵活的模式,可伸缩性和强大的索引功能而闻名。 这种快速性能的核心是MongoDB索引,它通过避免全集合扫描并因此限制了MongoDB搜索的文档数量来支持查询的有效执行。
从2.4版开始,MongoDB首先提供了一项实验性功能,该功能支持使用文本索引进行全文 本搜索 。 现在,此功能已成为产品不可或缺的一部分(不再是实验功能)。 在本文中,我们将直接从基础上探索MongoDB的全文本搜索功能。
如果您不熟悉MongoDB,建议您阅读Envato Tuts +上的以下文章,这些文章将帮助您了解MongoDB的基本概念:
基础
在开始任何细节之前,让我们先看一下背景。 全文搜索是指根据用户指定的搜索条件搜索全文数据库的技术。 这类似于我们通过输入某些字符串关键字/短语并返回按其排名排序的相关结果来搜索Google(或实际上任何其他搜索应用程序)上的任何内容的方法。
在更多情况下,我们将看到全文搜索:
- 考虑在Wiki上搜索您喜欢的主题。 当您在Wiki上输入搜索文本时,搜索引擎将显示与您搜索的关键字/短语相关的所有文章的结果(即使这些关键字在文章的内部使用了)。 这些搜索结果根据它们的匹配分数按相关性排序。
- 作为另一个示例,考虑一个社交网站,用户可以在其中进行搜索以查找包含关键字
cats
所有帖子。 在他们之中; 或者更复杂的是,所有带有注释的帖子都包含cats
一词。
在继续之前,您应该了解一些与全文搜索有关的通用术语。 这些术语适用于任何全文本搜索实现(不适用于MongoDB)。
停用词
停用词是不相关的词,应从文本中过滤掉。 例如:a,an,the,is,at,which等。
抽干
词干是将单词减少到词干的过程。 例如:站立,站立,站立等词语具有共同的基本立场。
计分
相对排名来衡量哪个搜索结果最相关。
MongoDB中全文本搜索的替代方法
在MongoDB提出文本索引的概念之前,我们要么对数据建模以支持关键字搜索,要么使用正则表达式来实现这种搜索功能。 但是,使用以下任何一种方法都有其自身的局限性:
- 首先,这些方法都不支持词干,停用词,排名等功能。
- 使用关键字搜索将需要创建多关键字索引,这比全文索引还不够。
- 从性能的角度来看,使用正则表达式效率不高,因为这些表达式无法有效利用索引。
- 除此之外,这些技术都不能用于执行任何词组搜索(例如搜索“ 2015年发行的电影”)或加权搜索。
除了这些方法之外,对于更高级和更复杂的以搜索为中心的应用程序,还有其他解决方案,例如Elastic Search或SOLR 。 但是使用这些解决方案中的任何一种都会增加应用程序的体系结构复杂性,因为MongoDB现在必须与其他外部数据库进行对话。
请注意,MongoDB的全文搜索不建议完全替代搜索引擎数据库,例如Elastic,SOLR等。但是,它可以有效地用于当今使用MongoDB构建的大多数应用程序。
介绍MongoDB文本搜索
使用MongoDB全文搜索,您可以在文档中任何值为字符串或字符串数组的字段上定义文本索引。 当我们在字段上创建文本索引时,MongoDB将标记并阻止索引字段的文本内容,并相应地设置索引。
为了进一步了解事物,让我们现在深入探讨一些实际的事物。 我希望您通过尝试mongo shell中的示例来跟随本教程。 我们将首先创建一些示例数据,我们将在整篇文章中使用这些数据,然后继续讨论关键概念。
就本文而言,请考虑一个收集messages
,该messages
存储以下结构的文档:
{
"subject":"Joe owns a dog",
"content":"Dogs are man's best friend",
"likes": 60,
"year":2015,
"language":"english"
}
让我们使用insert
命令插入一些样本文档来创建测试数据:
db.messages.insert({"subject":"Joe owns a dog", "content":"Dogs are man's best friend", "likes": 60, "year":2015, "language":"english"})
db.messages.insert({"subject":"Dogs eat cats a