RavenDB комплексный индекс MapReduce отсутствует вывод - PullRequest
1 голос
/ 12 октября 2011

Это продолжение проекта от этого поста .

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

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.

1 Ответ

1 голос
/ 12 октября 2011

Я смог сделать эту работу, немного изменив модель:

public class Product
{
  public string Id { get; set; }
  public int CategoryId { get; set; }
  public ProductSpec[] Specs { get; set; }
}

public class ProductSpec
{
  public string Key { get; set; }
  public string Value { get; set; }
}

В этой модели индекс MapReduce, как заявлено в вопросе, работает как положено, и быстро!Я думаю, что основная проблема заключается в способе обработки словарей после компиляции определения карты.

...