2012-05-03 38 views
2

我正在玩MongoDB,看看它有什么好的功能。我创建了一个小型测试套件,代表一个简单的博客系统,包含帖子,作者和评论,非常基本。MongoDB中的全文搜索和倒序索引

我已经试验过使用MongoRegEx类(PHP驱动程序)的搜索功能,我只是在对“/ I”区分大小写的句子'lorem ipsum'后搜索所有后期内容和后期标题, 。

我的代码如下所示:

$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经验的人都可以帮助我理解这种带索引或不带索引的全文搜索是怎么回事,肯定没有倒排索引?

真诚 - Mestika

+0

如果你还没有看到:http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo –

+1

mongodb正则表达式不使用索引,除非它是“开始”类型的正则表达式 - 我已经取得了一些成功,将所有术语分解成一个数组,并对其进行索引。我计划将该解决方案迁移到Elastic Search(用于全文搜索部分),同时将所有内容都保存在mongo中用于其他类型的查询。是的,如果它被访问并且它具有可用内存,它会将你的数据保存在RAM中。 –

回答

4

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

第二件事,对于正则表达式搜索而不是锚定在该字段的值的开始处并且使用^,根本没有使用索引。你应该玩explain()看看实际发生了什么。