Драйвер C # MongoDB очень медленный при текстовом поиске

c# .net mongodb full-text-search mongodb-query

539 просмотра

2 ответа

У меня есть поиск текста по шаблону по миллиону документов.

Я могу использовать свой полнотекстовый индекс прямо из консоли 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 документов. Общее время 1670368мс. Avg. 10

Делай 27 минут и 50 секунд.

Автор: BanksySan Источник Размещён: 24.10.2019 04:24

Ответы (2)


1 плюс

Task.Result является блокирующим вызовом (в данном случае collection.FindAsync (filter) .Result), он будет ждать вычисления полного набора результатов и затем вернется.

Вы можете попробовать этот код, и я уверен, что он будет работать лучше (хотя и не проверен)

using(var cursor = await collection.Find(filter).ToCursorAsync())
{
    while(await cursor.MoveNextAsync())
    {
        //rest of logic ....
Автор: Saleem Размещён: 08.02.2016 12:01

0 плюса

Не уверен, какую версию драйвера mongoDb вы используете, но вы можете попробовать это

 while (cursor.MoveNextAsync().Result)
Автор: Aladin Hdabe Размещён: 07.02.2016 07:57
Вопросы из категории :
32x32