2016-12-08 3 views
-1

검색 기능에 pagetype 필터가 있고 페이지 b가 페이지 a에서 상속받는 시나리오가 있습니다. 내 filterlist에서 페이지 옵션을 검사 할 때 나는 여전히 페이지 b라는 히트를 얻는다. EPiServer 검색에서 기본 유형 만 검색 할 수 있습니까? 내 경우에는EPiServer 기본 검색에 대해서만 검색

페이지 B :

public class b : a 
    { 
     public virtual string ExternalUrl { get; set; } 
    [ScaffoldColumn(false)] 
    [JsonIgnore] 
    [Searchable(false)] 
    public virtual string Id { get; set; } 
} 

및 페이지 A

public class a: SitePageData 
{ 
    [Display(GroupName = SystemTabNames.Content, Order = 4)] 
    [CultureSpecific] 
    [UIHint(UIHint.Textarea)] 
    public virtual String Intro { get; set; } 

    [Display(GroupName = SystemTabNames.Content, Order = 5)] 
    [CultureSpecific] 
    public virtual XhtmlString MainBody { get; set; } 

    [Display(GroupName = SystemTabNames.Content, Order = 6)] 
    public virtual ContentArea MainContentArea { get; set; } 

    [Display(GroupName = SystemTabNames.Content, Order = 8)] 
    public virtual RelatedInformationBlock RelatedInformation { get; set; } 

    [Display(GroupName = SystemTabNames.Settings, Order = 9000)] 
    public virtual SocialMediaShareLinksBlock ShareLinks { get; set; } 

    public override void SetDefaultValues(ContentType contentType) 
    { 
     base.SetDefaultValues(contentType); 

     ShareLinks.ShowFacebookShareLink = true; 
     ShareLinks.ShowTwitterShareLink = true; 
     ShareLinks.ShowLinkedInShareLink = true; 
    } 
} 

그리고 내 pagetypefilter에 나는 단지

여기 전체 쿼리

의 클래스에 대한 옵션을 체크 한
 private IQueryExpression CreateQuery(SearchQuery searchQuery) 
    { 
     var query = new GroupQuery(LuceneOperator.AND); 

     if (!(searchQuery.SearchText.StartsWith("\"") && searchQuery.SearchText.EndsWith("\""))) 
      searchQuery.SearchText = searchQuery.SearchText.Replace(" ", "* ") + "*"; 

     if (!string.IsNullOrWhiteSpace(searchQuery.SearchText)) 
     { 
      var searchTextQuery = new GroupQuery(LuceneOperator.OR); 
      //searchTextQuery.QueryExpressions.Add(new TermBoostQuery(searchQuery.SearchText, Field.Created,10000F)); 
      searchTextQuery.QueryExpressions.Add(new TermBoostQuery(searchQuery.SearchText, Field.Title, 1F)); 
      searchTextQuery.QueryExpressions.Add(new TermBoostQuery(searchQuery.SearchText, Field.ItemType, 0.2F)); 

      searchTextQuery.QueryExpressions.Add(new TermBoostQuery(searchQuery.SearchText, Field.DisplayText, 0.1F)); 


      searchTextQuery.QueryExpressions.Add(new FieldQuery(searchQuery.SearchText)); 
      query.QueryExpressions.Add(searchTextQuery); 
     } 

     var virtualPathQueryGroup = new GroupQuery(LuceneOperator.OR); 

     if (searchQuery.RootsFilter.IsNullOrEmpty()) 
     { 
      var contentRootQuery = new VirtualPathQuery(); 
      contentRootQuery.AddContentNodes(ContentReference.StartPage); 
      virtualPathQueryGroup.QueryExpressions.Add(contentRootQuery); 

      var contentRootQuery2 = new VirtualPathQuery(); 
      contentRootQuery2.AddContentNodes(SiteDefinition.Current.GlobalAssetsRoot); 
      virtualPathQueryGroup.QueryExpressions.Add(contentRootQuery2); 
      var contentRootQuery3 = new VirtualPathQuery(); 
      contentRootQuery3.AddContentNodes(SiteDefinition.Current.ContentAssetsRoot); 
      virtualPathQueryGroup.QueryExpressions.Add(contentRootQuery3); 
     } 
     else 
     { 
      virtualPathQueryGroup.QueryExpressions.Clear(); 

      foreach (var root in searchQuery.RootsFilter) 
      { 
       var contentRootQuery = new VirtualPathQuery(); 
       contentRootQuery.AddContentNodes(root); 
       virtualPathQueryGroup.QueryExpressions.Add(contentRootQuery); 
      } 
     } 

     query.QueryExpressions.Add(virtualPathQueryGroup); 

     if (searchQuery.PageTypesFilter.Any() || searchQuery.MediaTypesFilter.Any()) 
     { 
      var contentQuery = new GroupQuery(LuceneOperator.OR); 

      if (searchQuery.MediaTypesFilter.Any()) 
      { 
       var mediaContentQuery = new GroupQuery(LuceneOperator.OR); 

       foreach (var type in searchQuery.MediaTypesFilter) 
        mediaContentQuery.QueryExpressions.Add(new TypeContentQuery(type)); 

       contentQuery.QueryExpressions.Add(mediaContentQuery); 
      } 

      if (searchQuery.PageTypesFilter.Any()) 
      { 
       var pageContentQuery = new GroupQuery(LuceneOperator.AND); 
       var pageContentQueryTypes = new GroupQuery(LuceneOperator.OR); 

       foreach (var type in searchQuery.PageTypesFilter) 
        pageContentQueryTypes.QueryExpressions.Add(new TypeContentQuery(type)); 

       pageContentQuery.QueryExpressions.Add(new FieldQuery(CultureInfo.CurrentUICulture.Name, Field.Culture)); 
       pageContentQuery.QueryExpressions.Add(pageContentQueryTypes); 

       contentQuery.QueryExpressions.Add(pageContentQuery); 
      } 

      query.QueryExpressions.Add(contentQuery); 
     } 

     if (!searchQuery.CategoriesFilter.IsNullOrEmpty()) 
     { 
      var categoriesToCommaList = String.Join(",", searchQuery.CategoriesFilter); 
      var categoryQuery = new ContentCategoryQuery(CategoryList.Parse(categoriesToCommaList), LuceneOperator.OR); 

      query.QueryExpressions.Add(categoryQuery); 
     } 
     // // The access control list query will remove any files the user doesn't have read access to 
     AccessControlListQuery aclQuery = new AccessControlListQuery(); 
     aclQuery.AddAclForUser(PrincipalInfo.Current, HttpContext.Current); 
     query.QueryExpressions.Add(aclQuery); 


     return query; 
    } 

마지막으로 Typequery 자체 :

+0

모든 파생 된 클래스를 제외하려면 '클래스 b'가 결과에 전혀 나열되어서는 안됩니다. 우리는 또한 당신이 당신의 물건을 어떻게 구성 하는지를 알아야합니다. –

+0

정확합니다. 내 질문 편집 –

+0

글쎄, 일반적으로 OOTB 나는 안된다고. 그러나 당신은'contentSearchHandler.GetContent (xxx); '을 가지고 있으며 결과를 반영하기 위해 그 결과로 작업 할 수 있습니다. –

답변

0

이렇게하려면 표준 페이지 필터가 구현되지 않은 것처럼 보입니다. 그러나 EPiServer.Filters.IPageFilter 클래스를 확장하여 자체 필터를 만들 수 있어야합니다. 그리고 파일러에서 Type.IsSubclassOf을 사용하여 페이지의 유형을 확인하십시오.

0

내가 생각하는 문제는 색인 생성입니다. ContentSearchHandler 클래스에서 GetItemType (Type contentType) 메서드는 모든 기본 유형을 ItemType 필드에 추가합니다. 이 메서드는 public 가상이므로 기본 형식 만 반환하는 StructureMap 컨테이너에서 자신의 구현으로 바꿀 수 있어야합니다.

관련 문제