【问题标题】:Extremely Slow MongoDb C# Driver 2.0 RegEx Query极慢 MongoDb C# Driver 2.0 RegEx 查询
【发布时间】:2016-01-05 17:26:12
【问题描述】:

我有以下查询 - 大约需要 20-40 秒才能完成(同一集合上没有 RegEx 的类似查询最多需要几毫秒):

var filter = Builders<BsonDocument>.Filter.Regex("DescriptionLC", new BsonRegularExpression(descriptionStringToFindFromCallHere, "i"));

var mongoStuff = GetMongoCollection<BsonDocument>(MongoConstants.StuffCollection);

var stuff = await mongoStuff
    .Find(filter)
    .Limit(50)
    .Project(x => Mapper.Map<BsonDocument, StuffViewModel>(x))
    .ToListAsync();

我看到answer here 似乎暗示使用以下格式(逐字复制)此查询会更快:

var names = namesCollection.AsQueryable().Where(name =>
    name.FirstName.ToLower().Contains("hamster"));

但是,该项目使用的是 MongoDb .NET Driver 2.0 和 doesn't support LINQ。所以,我的问题归结为:

一)。使用 LINQ 会明显更快,还是差不多?我可以更新到 1,但我宁愿不更新。
乙)。我能做些什么来加快速度吗?我已经在寻找仅小写的字段了。

------------结束原帖------------

编辑:通过将 .Limit(50) 更改为 .Limit(5) 来减少返回的“东西”数量,从而线性减少了调用时间。后者的 40 秒下降到 4,我尝试了不同的数字,这似乎是直接相关的。这对我来说很奇怪,但我真的不明白它是如何工作的。

编辑 2:似乎唯一的解决方案可能是使用“开始于”而不是“包含”正则表达式。根据docs(“索引使用”部分),显然后者没有有效地使用索引。

编辑3:最后,我做了三件事(字段已经被索引):

1)。减少返回的结果数量 - 这极大地帮助了返回的项目数量与调用所用时间之间的线性相关性。
2)。将搜索更改为仅小写 - 这仅略有帮助。
3)。将正则表达式更改为仅搜索“开始于”而不是“包含”,同样,这几乎没有帮助,对此的更改是:

//Take the stringToSearch and make it into a "starts with" RegEx
var startingWithSearchRegEx = "^" + stringToSearch; 

然后将其传递给新的 BsonRegularExpression 而不仅仅是搜索字符串。

仍在寻找任何反馈!

【问题讨论】:

  • 您有关于 DescriptionLC 的索引吗?
  • @Jaco 刚刚仔细检查过——我愿意。
  • collection 有多少条记录?
  • @mofenko 抱歉,我有一段时间没有检查了。该集合有数万到数十万条记录。

标签: mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

不建议对数十万个文档使用正则表达式,因为它本质上是在进行文档扫描,因此根本没有使用索引。

这是您的查询如此缓慢的主要原因。它与.net 驱动程序无关。

如果您有很多文本或经常搜索文本模式,我会建议在感兴趣的字段上创建文本索引并进行全文搜索。请参阅$text 的文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多