Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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中,问题有多大;扫描/返回的对象已超过1000”;_Mongodb_Indexing - Fatal编程技术网

在MongoDB中,问题有多大;扫描/返回的对象已超过1000”;

在MongoDB中,问题有多大;扫描/返回的对象已超过1000”;,mongodb,indexing,Mongodb,Indexing,与今天早些时候的事件有关。关于这个主题的相关文章。我们已经构建了一个实时搜索,从25万个名称的集合中获取前20个响应,我们希望正确地获取数据 目前,如果我使用: db.collection.find({ "drug": { "$regex": "cols", "$options": "i" } }) 然后我收到来自MongoDB Atlas的电子邮件警告,说扫描/返回的对象已超过1000个。这是

与今天早些时候的事件有关。关于这个主题的相关文章。我们已经构建了一个实时搜索,从25万个名称的集合中获取前20个响应,我们希望正确地获取数据

目前,如果我使用:

db.collection.find({ "drug": { "$regex": "cols", "$options": "i" } })
然后我收到来自MongoDB Atlas的电子邮件警告,说
扫描/返回的对象已超过1000个
。这是因为我没有使用
$search
,所以我没有使用文本索引。每个查询似乎都在扫描整个250K行,以获得最佳的20个匹配项。不幸的是,如果我使用这个:

db.collection.find({ $text: { $search: "dog cat" } })
虽然我不会被电子邮件轰炸,但搜索结果并不好,因为它们不能捕获部分字符串。。。例如,如果我搜索篮球运动员
Zion Williamson
,当输入部分字符串
Zion Williams
时,我不会得到任何结果。。。使用regex,它会正确返回
Zion Williamson

坚持使用
regex
方法而忽略这些电子邮件警告是否有问题?在mongo的
$search
能够更好地捕获部分字符串之前,我不想在实时搜索中使用它。是否可以仅针对此特定表关闭此特定警告的电子邮件警报

提前感谢您对此的任何想法


编辑:所讨论的集合相当小(16MB),约有250K个文档,每个文档中有5个值。另外,
$regex
$search
的性能都足够(~0.1秒)-
$regex
的全表扫描不会对数据获取性能造成太大的影响。

正如您在编辑中添加的那样-问题主要归结为性能。但是,不仅要考虑单个查询的性能,还要考虑在生产负载下的性能。您希望每秒有多少个请求执行此查询

如果每秒钟做一次,甚至更少,现在就可以了。但是,如果数据集增长了,或者您开始看到更多的请求,该怎么办?这就是你开始遇到问题的时候

从您的示例中,我不清楚是否只需要不区分大小写的“start_with”搜索。如果是这种情况,那么您可以实际使用索引:

  • 另外,将搜索字符串存储为to_lower或to_upper格式
  • 将正则表达式更改为
    ^小写搜索字符串
现在,您的搜索字符串不区分大小写,可以使用索引(它相当于
像'string%'

但是,请记住,使用to_lower或to_upper可能会弄乱您的文本()——当然,如果您仍然需要全文搜索,在这种情况下,您可以这样做

  • 遵守上述性能限制
  • 使用普通全文搜索查询的功能限制
  • 建立自定义三角图索引(或进一步研究以改进postgres中的文本搜索)
  • 寻找替代品。如果您需要全文搜索,也许像ElasticSearch这样的特殊构建DB更适合您的用例

感谢您的投入。数据中有一些带有前缀的标签(例如
M:Duke Blue Devils
F:Duke Blue Devils
用于男性和女性),此外,用户在搜索时通常只使用姓氏。基于这些原因,我认为
start\u with
很难提供最佳的搜索结果。我只建议使用toupper/tolower来统一数据,您可以执行任何类型的修改,例如删除前缀或使用另一个翻转名字和姓氏的属性。这听起来可能很乏味,但我见过类似的事情。然而,如果对您来说是可行的,您可以最好地判断具体的数据集