【问题标题】:C# MongoDB driver very slow on text searchC# MongoDB 驱动程序在文本搜索上非常慢
【发布时间】:2016-02-07 19:28:08
【问题描述】:

我对包含一百万个文档的集合进行通配符文本搜索。

我可以直接从 MongoDB 控制台使用我的全文索引:

 db.oneMillionDocumentsIndexed.find({$text: { $search: "raven" } } )

这会在一分钟后返回文档。

但是,当我在单元测试中尝试相同的事情时,测试运行了半个多小时而没有返回任何文档:

[Test]
public void SearchTextFullText()
{
    var credential = MongoCredential.CreateCredential("test", "readonlyUser", "password");
    var settings = new MongoClientSettings
                   {
                       Credentials = new[] { credential },
                       Server = new MongoServerAddress("localhost")
                   };

    var mongoClient = new MongoClient(settings);

    var database = mongoClient.GetDatabase("test");

    var collection = database.GetCollection<BsonDocument>("oneMillionDocumentsIndexed");

    var searchWord = "raven";

    var filter = Builders<BsonDocument>.Filter.Text(searchWord);


    var documentCount = 0;


    var stopwatch = new Stopwatch();

    stopwatch.Start();
    using (var cursor = collection.FindAsync(filter).Result)
    {
        while (cursor.MoveNext())  // <-- We never get past this point
        {
            var batch = cursor.Current;

            foreach (var document in batch)
            {
                Console.WriteLine(document["_id"].AsObjectId.ToString());
                Assert.That(document, Is.Not.Null);
                documentCount++;
            }

        }
    }
    stopwatch.Stop();

    Console.WriteLine($"Found {documentCount} documents.  Total time {stopwatch.ElapsedMilliseconds}ms.  Avg. {stopwatch.ElapsedMilliseconds / documentCount}");
}

终于完成了:找到了 158791 个文档。总时间 1670368ms。平均10

做 27 分 50 秒。

【问题讨论】:

  • 请注意,您在 shell 中运行的查询只是“返回”游标的前 25 个结果以及您列出的内容。除非您实际上在其中包含代码来迭代游标,否则这不是一回事。这两种情况都不是“查询”本身的衡量标准,最好的衡量标准是“解释”。因此,一般来说,当您要求158791 大小不确定(由于文本而可能很大)的文档也可能通过网络传输到客户端时,这将需要一些时间。
  • 干杯@BlakesSeven。我考虑过,但输入it 总是立即返回,这让我认为它不是光标(?)
  • 另一个25 不是158791。如果你想要一个公平的比较,那么你需要一个循环。即var count = 0; db.oneMillionDocumentsIndexed.find({$text: { $search: "raven" } } ).forEach(function(doc) { printjson(doc); count++ }); print(count);
  • 我会试试的,谢谢! (可能没有printjson,尽管我知道打印会增加大量开销。)
  • C# 清单中明显的开销。苹果配苹果。

标签: c# .net mongodb full-text-search mongodb-query


【解决方案1】:

Task.Result 是一个阻塞调用(在本例中为 collection.FindAsync(filter).Result),它会等到计算完完整的结果集后再返回。

你可以试试这段代码,我相信它会表现得更好(虽然未经测试)

using(var cursor = await collection.Find(filter).ToCursorAsync())
{
    while(await cursor.MoveNextAsync())
    {
        //rest of logic ....

【讨论】:

    【解决方案2】:

    不确定您使用的是什么版本的 mongoDb 驱动程序,但您可以试试这个

     while (cursor.MoveNextAsync().Result)
    

    【讨论】:

    • 我试试看。
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2016-05-24
    • 2016-03-12
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多