我正在玩MongoDB,看看它有什么不错的功能。我创建了一个小型测试套件,代表一个简单的博客系统,其中包含帖子,作者和评论,非常基础。
我已经尝试了一个使用MongoRegEx类(PHP驱动程序)的搜索功能,我只是搜索所有帖子内容并在句子'lorem ipsum'之后发布标题,区分大小写为“/ I”。
我的代码如下所示:
$regex = new MongoRegEx('/lorem ipsum/i');
$query = array('post' => $regex, 'post_title' => $regex);
但我对发生的事情感到困惑和震惊。我检查每个查询的运行时间(在查询之前和之后设置microtime并获得15位小数的时间)。
在我的第一次测试中,我添加了110.000个博客文档和5000个作者,随机生成了所有内容。当我进行搜索时,它会找到6824个带有“lorem ipsum”的帖子,并且需要0.000057935714722秒来进行搜索。这是之后我重置了MongoDB服务(使用Windows),除了_id上的默认值之外没有任何索引。
MongoDB使用B树索引,对于全文搜索来说,这绝对不是非常有效。如果我在我的帖子内容属性上创建一个索引,那么同样的查询将在0.000150918960571中运行,这比任何索引都要慢得多(因子为0.000092983245849时速度较慢)。现在出现这种情况有几个原因,因为它使用B树游标。
但是我试图寻找一个关于如何快速查询它的解释。我想它可能会保留我RAM中的所有内容(我有4GB,数据库大约500MB)。这就是我尝试重新启动mongodb服务以获得完整结果的原因。
任何有MongoDB经验的人都可以帮助我了解这种带或不带索引的全文搜索是什么,并且没有倒排索引吗?
此致 - 梅斯蒂卡
答案 0 :(得分:4)
我认为你根本没有对结果进行迭代?只需一个find(),驱动程序就会不向服务器发送查询。您需要至少获取一个结果。我不相信MongoDB这么快,我相信你的错误是你的基准。
作为第二件事,对于不的正则表达式搜索,使用^
锚定在字段值的开头,根本不使用索引。您应该使用explain()来查看实际发生的情况。