2016-12-08 22 views
-1

検索機能にpagetypefilterがあり、ページbがページaから継承するシナリオがあります。私は私のフィルタリストのオプションをページにチェックすると、まだタイプがページ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; } 
} 

とページ

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自身:

public class TypeContentQuery : IQueryExpression 
{ 
    private readonly Type contentType; 
public TypeContentQuery(Type contentType) 
{ 
    if (contentType == null) 
    { 
     throw new ArgumentNullException("contentType"); 
    } 
    this.contentType = contentType; 
} 

public string GetQueryExpression() 
{ 
    var typeExpression = "\"" + ContentSearchHandler.GetItemTypeSection(contentType) + "\""; 
    return new FieldQuery(typeExpression, Field.ItemType).GetQueryExpression(); 
    } 
} 
+0

これは、すべての派生クラスを除外することを意味しますか?あなたのケースでは、 'class b'は結果に全くリストされていないはずですか?私たちはまた、あなたのa、bオブジェクトをどのように構築するかを知る必要があります。 –

+0

正確です。私の質問を編集しました –

+0

よく、一般的にOOTBはいいえと言います。しかし、あなたは 'contentSearchHandler.GetContent (xxx); 'を持っていて、その結果から結果を反映させることができます。 –

答えて

0

標準のページフィルタが実装されていないように見えます。 しかし、EPiServer.Filters.IPageFilterクラスを拡張することで独自のフィルタを作成できるはずです。そしてあなたのファイルではType.IsSubclassOfを使ってページのタイプをチェックしてください。

0

私が考える問題は、インデックス作成です。 ContentSearchHandlerクラスでは、GetItemType(Type contentType)メソッドはすべての基本タイプをItemTypeフィールドに追加します。このメソッドはパブリックなバーチャルなので、基本型のみを返すStructureMapコンテナで独自の実装に置き換えることができます。

関連する問題