Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
全文检索&;MongoDB中的反向索引_Mongodb_Full Text Search_B Tree_Mongodb Php_Inverted Index - Fatal编程技术网

全文检索&;MongoDB中的反向索引

全文检索&;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

我现在正在玩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树索引,这对于全文搜索肯定不是很有效。如果我在我的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中。