在MongoDB中,问题有多大;扫描/返回的对象已超过1000”;
与今天早些时候的事件有关。关于这个主题的相关文章。我们已经构建了一个实时搜索,从25万个名称的集合中获取前20个响应,我们希望正确地获取数据 目前,如果我使用:在MongoDB中,问题有多大;扫描/返回的对象已超过1000”;,mongodb,indexing,Mongodb,Indexing,与今天早些时候的事件有关。关于这个主题的相关文章。我们已经构建了一个实时搜索,从25万个名称的集合中获取前20个响应,我们希望正确地获取数据 目前,如果我使用: db.collection.find({ "drug": { "$regex": "cols", "$options": "i" } }) 然后我收到来自MongoDB Atlas的电子邮件警告,说扫描/返回的对象已超过1000个。这是
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来统一数据,您可以执行任何类型的修改,例如删除前缀或使用另一个翻转名字和姓氏的属性。这听起来可能很乏味,但我见过类似的事情。然而,如果对您来说是可行的,您可以最好地判断具体的数据集