2

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

我尝试了一个使用 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 经验的人都可以帮助我了解这种带或不带索引且绝对没有倒排索引的全文搜索发生了什么吗?

真诚的 - Mestika

4

1 回答 1

4

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

其次,对于没有用 锚定在字段值开头的正则表达式搜索,根本^使用索引。您应该使用explain()来查看实际发生的情况。

于 2012-05-03T13:49:31.527 回答