【问题标题】:Full Text Search & Inverted Indexes in MongoDBMongoDB中的全文搜索和倒排索引
【发布时间】:2012-05-12 23:54:03
【问题描述】:

我目前正在使用 MongoDB,看看它有哪些不错的功能。我创建了一个小型测试套件,代表一个简单的博客系统,其中包含帖子、作者和 cmets,非常基本。

我尝试了一个使用 MongoRegEx 类(PHP 驱动程序)的搜索功能,我只是在“/I”上区分大小写的句子“lorem ipsum”之后搜索所有帖子内容和帖子标题。

我的代码如下所示:

$regex = new MongoRegEx('/lorem ipsum/i');  
$query = array('post' => $regex, 'post_title' => $regex);

但我对发生的事情感到困惑和震惊。我检查每个查询的运行时间(在查询之前和之后设置微时间,并获得 15 位小数的时间)。

对于我的第一个测试,我添加了 110.000 个博客文档和 5000 个作者,所有内容都是随机生成的。当我进行搜索时,它会找到 6824 个带有“lorem ipsum”句子的帖子,搜索需要 0.000057935714722 秒。这是我重置了 MongoDB 服务(使用 Windows)并且除了 _id 上的默认值之外没有任何索引。

MongoDB 使用 B-tree 索引,这对于全文搜索肯定不是很有效。如果我在我的帖子内容属性上创建一个索引,与上面相同的查询在 0.000150918960571 中运行,这很有趣,这比没有任何索引时要慢(慢,系数为 0.000092983245849)。现在发生这种情况有几个原因,因为它使用了 B 树游标。

但我试图寻找一个解释,说明它如何能够如此快速地查询它。我想它可能会将所有内容都保存在我的 RAM 中(我有 4GB,数据库大约 500MB)。这就是为什么我尝试重新启动 mongodb 服务以获得完整结果的原因。

任何有 MongoDB 经验的人都可以帮助我了解这种带或不带索引且绝对不带倒排索引的全文搜索的情况吗?

真诚的 - 梅斯蒂卡

【问题讨论】:

  • mongodb 正则表达式不使用索引,除非它是“开头”类型的正则表达式——我已经成功地将所有术语分解为一个数组,并对其进行索引。我计划将该解决方案迁移到 Elastic Search(用于全文搜索部分),同时将所有内容保留在 mongo 中以用于其他类型的查询。是的,如果您的数据正在被访问并且有空闲内存,它会将您的数据保存在 RAM 中。

标签: mongodb full-text-search b-tree mongodb-php inverted-index


【解决方案1】:

我认为您根本没有对结果进行迭代?仅使用 find(),驱动程序将不会向服务器发送查询。您需要为此获取至少一个结果。我不相信 MongoDB 这么快,我相信你的错误在你的基准测试中。

第二件事,对于^ 锚定在字段值开头的正则表达式搜索,根本不使用索引。您应该与explain() 一起玩,看看实际发生了什么。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2011-10-06
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多