Это продолжение проекта от этого поста .
У меня есть следующая модель:
public class Product
{
public string Id { get; set; }
public int CategoryId { get; set; }
public Dictionary<string, string> Specs { get; set; }
}
И я бы хотел создать карту уменьшитьИндекс, который группирует продукты по CategoryId, а затем объединяет все пары имя-значение спецификации.Вывод функции уменьшения должен выглядеть следующим образом:
public class CategorySpecGroups
{
public int CategoryId { get; set; }
public SpecGroup[] SpecGroups { get; set; }
}
public class SpecGroup
{
public string Name { get; set; }
public SpecGroupValue[] Values { get; set; }
}
public class SpecGroupValue
{
public string Value { get; set; }
public int Count { get; set; }
}
Это должно поддерживать фасетный поиск по коллекции продуктов.Вывод аналогичен документу FacetSetup из функции граненого поиска RavenDB .Ниже приведено определение индекса:
public class SpecGroups_ByCategoryId : AbstractIndexCreationTask<Product, CategorySpecGroups>
{
public SpecGroups_ByCategoryId()
{
this.Map = products => from product in products
where product.Specs != null
select new
{
CategoryId = product.CategoryId,
SpecGroups = from spec in product.Specs
select new
{
Name = spec.Key,
Values = new dynamic[] { new { Value = spec.Value, Count = 1 } }
}
};
this.Reduce = results => from categorySpecGroups in results
group categorySpecGroups by categorySpecGroups.CategoryId into g
select new
{
CategoryId = g.Key,
SpecGroups = from categorySpecGroups in g
from specGroup in categorySpecGroups.SpecGroups
group specGroup by specGroup.Name into g2
select new
{
Name = g2.Key,
Values = from specGroup in g2
from specGroupValue in specGroup.Values
group specGroupValue by specGroupValue.Value into g3
select new
{
Value = g3.Key,
Count = g3.Sum(x => x.Count)
}
}
};
}
}
После сохранения этого индекса процесс индексации запускается, однако в выводе отсутствует свойство "SpecGroups":
{
"CategoryId": "123"
}
Мое намерение сЭтот индекс предназначен для оптимизации функции граненого поиска.При запросе только по идентификатору категории я могу использовать выходные данные этого индекса для возврата результатов фасетов, затем при фильтрации по дополнительным фасетам этот индекс можно использовать для получения терминов, используемых для вычисления фасетов в отфильтрованном наборе результатов.
Я использую RavenDB Build 495.