Нужно выбрать N документов на основе M предикатов, где M может быть несколько сотен штук (до 1000).
На вход метода приходит массив фильтров filters, по которым нужно выбрать документы из Монги.
public async Task<IEnumerable<DataDto>> GetDataAsync(IEnumerable<Expression<Func<DataDto, bool>>> predicates)
{
var filters = predicates.Select(p => new FilterDefinitionBuilder<DataDto>().Where(p));
var filter = new FilterDefinitionBuilder<DataDto>().Or(filters);
var result = await collection.FindAsync(filter) .ConfigureAwait(false);
return result.ToList();
}
Каждый предикат строится как:
a => a.Source.ID == filter.Source
&& a.Dest.ID == filter.Dest
&& a.Type == filter.Type
&& a.Date >= filter.MinDate && a.Date <= filter.MaxDate
&& ...;
Проблема в том, что таких предикатов приходит много и все это очень медленно работает.
Задача - получить данные, наиболее релевантные запросу (Запрос один, но по факту нужно найти подходящий документ для каждого предиката). Например, сначала получить документы по ID. Если часть из них не нашлась, то мы уменьшаем точность поиска (используем только несколько полей и диапазон дат).
Возможно, нужно использовать кардинально другой подход (не юзать монгу)?
Я видел в Эластике query score. Никогда не работал с ним, знаю, что он используется для полнотекстового поиска, но сама концепция с весами для документов мне показалась подходящей под мою задачу.