Карта уменьшить возвращает старые данные - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть следующая карта:

from doc in docs
select new {Name = doc.Name, Count = 1}

уменьшить

from result in results
group result by new {result.Name}
into g
select new {
Name =  g.Key.Name,
Count = Enumerable.Sum(g, x => ((int) x.Count))
}

Если я установлю блокировку на папку индекса, а затем сохраню документ, а затем удаляю документ и сохраняю документ для повторной индексации, старый документ по-прежнему отображается в результатах запроса индекса, несмотря на то, что индекс отображается как актуальный. Последняя проиндексированная дата также старше даты обновления документа, поэтому в индексе не должно быть старых результатов.

Есть идеи, что происходит? На самом деле это часть большой проблемы, которую я обнаружил в производственной системе. Я не понимаю, почему это происходит, но я смог воспроизвести подобную ситуацию, заблокировав индекс, поэтому я подозреваю, что есть какой-то процесс, вызывающий блокировку. Это означает, что результаты индекса возвращают старые прогнозы.

Как получить редуктор, чтобы отфильтровать старые результаты?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

То, что вы описываете, это устаревшие индексы: вы обновляете / создаете / удаляете документ и сразу запрашиваете документ, но запрос возвращает устаревшие результаты.

Рекомендованный способ исправить это - вызвать. WaitForIndexesAfterSaveChanges () во время вызовов создания / обновления / удаления:

// Inform Raven you'll wait for indexes when calling .SaveChanges
session.Advanced.WaitForIndexesAfterSaveChanges(
    timeout: TimeSpan.FromSeconds(30),
    throwOnTimeout: false);

// Do your update.
session.Store(new Employee
{
    FirstName = "John",
    LastName = "Doe"
});

// This won't return until affected indexes are updated.
session.SaveChanges();

// Now you can run a query against your index, and it will return the updated data.
...

Таким образом .SaveChanges будет блокироваться, пока индексы не будут обновлены. Запустите ваш запрос сразу после .SaveChanges, и вы увидите обновленные результаты, как и ожидалось.

0 голосов
/ 11 ноября 2018

Если вы отключили индекс, а документы обновлены / удалены. Вы получите устаревшие результаты из индекса map-Reduce. Это может произойти, даже если индекс не отключен.

Причина в том, что индексы в конечном итоге непротиворечивы. Вы можете прочитать об этом здесь: https://ravendb.net/docs/article-page/3.5/Csharp/users-issues/understanding-eventual-consistency

Вы можете использовать WaitForNonStaleResultsAsOfLastWrite: https://ravendb.net/docs/article-page/2.5/Csharp/client-api/querying/stale-indexes#setting-cut-off-point

...