非常慢的MongoDb C#Driver 2.0 RegEx查询

时间:2016-01-05 17:26:12

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

我有以下查询 - 完成大约需要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驱动程序2.0及其doesn't support LINQ。所以,我的问题归结为:

A)。使用LINQ会明显加快,还是差不多?我可以更新为1,但我不愿意 B)。有什么办法可以加快速度吗?我一直在寻找一个只有小写的字段。

------------结束发布原因------------

修改:通过将.Limit(50)更改为.Limit(5)来减少返回的“内容”数量会线性减少通话时间。用后者40秒降到4,我尝试了不同的数字,它似乎是一个直接的相关性。这对我来说很奇怪,但我真的不明白这是如何运作的。

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

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

1)。减少返回的结果数量 - 这有助于显着提高返回的项目数量与调用所需的时间之间的线性关系 2)。仅将搜索更改为小写 - 这只是略有帮助 3)。将正则表达式更改为仅搜索“starts with”而不是“contains”,再次,这几乎没有帮助,更改为:

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

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

仍在寻找任何反馈!!

1 个答案:

答案 0 :(得分:0)

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

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

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

的文档