全文检索&;MongoDB中的反向索引
我现在正在玩MongoDB,看看它有什么好功能。我创建了一个小测试套件,它代表了一个简单的博客系统,包含帖子、作者和评论,非常基本 我尝试了一个使用MongoRegEx类(PHP驱动程序)的搜索功能,我只是在“lorem ipsum”一句后面搜索所有帖子内容和帖子标题,并在“/I”上区分大小写 我的代码如下所示:全文检索&;MongoDB中的反向索引,mongodb,full-text-search,b-tree,mongodb-php,inverted-index,Mongodb,Full Text Search,B Tree,Mongodb Php,Inverted Index,我现在正在玩MongoDB,看看它有什么好功能。我创建了一个小测试套件,它代表了一个简单的博客系统,包含帖子、作者和评论,非常基本 我尝试了一个使用MongoRegEx类(PHP驱动程序)的搜索功能,我只是在“lorem ipsum”一句后面搜索所有帖子内容和帖子标题,并在“/I”上区分大小写 我的代码如下所示: $regex = new MongoRegEx('/lorem ipsum/i'); $query = array('post' => $regex, 'post_title
$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树索引,这对于全文搜索肯定不是很有效。如果我在我的post-content属性上创建一个索引,那么与上面相同的查询将在0.000150918960571中运行,这比没有任何索引时运行得慢(慢的系数为0.00009298345849)。现在这种情况可能会发生,原因有几个,因为它使用了B树游标
但我试图寻找一种解释,解释它如何能如此快速地查询它。我猜它可能把所有东西都保存在我的RAM中(我有4GB,数据库大约500MB)。这就是我尝试重新启动mongodb服务以获得完整结果的原因
有MongoDB经验的人能帮助我了解这种全文搜索(有索引或没有索引,当然没有倒排索引)的情况吗
诚恳
-梅斯蒂卡我想你只是没有重复结果?只需一个find(),驱动程序就不会向服务器发送查询。您需要为此获取至少一个结果。我不相信MongoDB有这么快,我相信您的错误在您的基准测试中
第二件事是,对于未使用
^
锚定在字段值开头的正则表达式搜索,根本不使用索引。你应该玩一下,看看到底发生了什么。我想你只是没有重复结果?只需一个find(),驱动程序就不会向服务器发送查询。您需要为此获取至少一个结果。我不相信MongoDB有这么快,我相信您的错误在您的基准测试中
第二件事是,对于未使用
^
锚定在字段值开头的正则表达式搜索,根本不使用索引。您应该玩一下,看看实际发生了什么。如果您没有看到:mongodb regex不使用索引,除非它是一个“start with”类型的regex——我已经成功地将所有术语分解成一个数组,并在此基础上建立索引。我计划将该解决方案迁移到弹性搜索(用于全文搜索部分),同时将所有内容保留在mongo中以用于其他类型的查询。是的,如果数据被访问并且有空闲内存,它会将数据保存在RAM中。如果您没有看到:mongodb regex不使用索引,除非它是“以开头”类型的regex——我已经成功地将所有术语分解成一个数组,并在此基础上建立索引。我计划将该解决方案迁移到弹性搜索(用于全文搜索部分),同时将所有内容保留在mongo中以用于其他类型的查询。是的,如果数据被访问并且有空闲内存,它会将数据保存在RAM中。