2017-01-11 1 views
0

У меня есть иерархия страниц, таких какКак создать фасет «категория» на основе родительской страницы?

- Root 
    - Category 1 
     - Page 1 
     - Page 2 
    - Category 2 
     - Page 3 

Я хочу использовать Найти, чтобы создать фильтр, основанный на именах категорий страниц. Вот что у меня до сих пор, немного я не могу понять, строка 4

var result = _searchClient.Search() 
        .For(query) 
        .Filter(x => x.Ancestors().Match(rootPageLink.ID.ToString())) 
        .FilterFacet("Categories", x => x.ParentLink) // This doesn't work 
        .HistogramFacetFor(x => x.Price, 100) 
        .Skip((pageNumber - 1) * pageSize) 
        .Take(pageSize) 
        .GetContentResult(); 

Очевидно, что это не работает, потому что фильтр() ожидает фильтра в качестве второго аргумента, но вы можете увидеть, что я Я пытаюсь это сделать. Это примерно, аналогичный запрос SQL, как GROUP BY ParentLink, а затем отображать информацию, как

Категория 1 (2 страницы)
Категории 2 (1 страницу)

+0

Несколько вопросов. Могут ли страницы вашего ребенка, т. Е. Страницы 1, иметь свои собственные дочерние страницы? Являются ли страницы одного и того же типа? –

+0

@ EricHerlitz На дочерних страницах сами дети. Страница 1,2 и 3 имеют одинаковый тип, а страницы категорий имеют одинаковый тип CategoryPage. –

ответ

1

Учитывая

  • вашей структуру выглядит подобный
  • Вы используете UnifiedSearch

Интерфейс ISearchContent из UnifiedSearch содержит два полезных свойства в вашем сценарии

  • SearchSection
  • SearchSubsection

Рассмотрим у вас есть этот путь

/returns/misc/yourstuff

При поиске по адресу Ваше содержание как единого поиска ударил SearchSection будет Возвращает и SearchSubsection будет Разное

При взгляде на Разное ударил SearchSection будет Возврат и SearchSubsection будет null или нет на ударе.

Это означает, что

  • SearchSection является всегда первый узел под корень , если ваш результат не является первым узлом уровня
  • SearchSubsection является всегда первый узел ниже SearchSection, если ваш результат не первый или второй уровень

В вашем сценарии страницы категорий всегда будут представлены как SearchSections.

Я не могу проверить это в данный момент, но что-то вроде этого должно начаться.

var result = _searchClient.Search() 
        .For(query) 
        .Filter(x => x.SearchSection.Exists()) 
        .Filter(x => x.SearchSection.Match("yourcategorypage")) 
        .TermsFacetFor(x => x.SearchSection) // create facets if you like, fun stuff 
        //.FilterFacet("Categories", x => x.ParentLink) // This doesn't work 
        //.Filter(x => x.Ancestors().Match(rootPageLink.ID.ToString())) 
        .HistogramFacetFor(x => x.Price, 100) 
        .Skip((pageNumber - 1) * pageSize) 
        .Take(pageSize) 
        .GetContentResult(); 

== Edit ниже ==

Чтобы настроить SearchSection с помощью выступов-то похожее на это должно быть реализовано, если вы хотите, чтобы SearchSection всегда быть ближайшим предком типа CategoryPage.

Для реализации в вашем Find инициализации

// use the appropriate datatype if PageData isn't applicable, i.e. ArticlePage 
SearchClient.Instance.Conventions.ForInstancesOf<PageData>() 
    .ExcludeField(x => x.SearchSection()) // remove the default mapping 
    .IncludeField(x => x.SearchSection(true)); // add your own mapping 

метод расширения SearchSection

public static class FieldExtensions 
{ 
    public static string SearchSection<T>(this T page, bool overriding) where T : PageData 
    { 
     // we need to check if this page is a CategoryPage first 
     if(page is CategoryPage) { 
      return ""; // I assume nothing? 
     } 

     var ancestors = loader.GetAncestors(page.ContentLink).OfType<CategoryPage>(); 
     if(ancestors.any()){ 
      var closestCategoryPage = ancestors.First(); 
      return closestCategoryPage.whateverproperty; 
     } 

     // customs: nothing to declare 
     return ""; 
    } 
} 

Или что-то подобное, вы поймете это :)

+0

Спасибо за это Эрик. Я только что передал его, а раздел и подразделение вернули первые две части пути, правильно? В моем вопросе я пытался упростить свой пример, поставив свои страницы под корень сайта, но на самом деле страницы имеют 3 уровня глубины. Можно ли получить сегмент пути _parent-страницы? –

+0

Правильно, это то, что они должны делать. И можно расширить UnifiedSearchHit, но не очень чистый подход. В таких случаях я бы рекомендовал использовать прогнозы. Я напишу пример об этом, когда я получу минута, но идея состоит в том, чтобы спроецировать то, что вы хотите на «SearchSection» или «SearchSubsection» –

+0

@GregB. Обновил пример с помощью настраиваемого сопоставления полей, которое будет лучше прогнозов –

Смежные вопросы