C# EPiServer搜索仅搜索基类型

C# EPiServer搜索仅搜索基类型,c#,.net,inheritance,lucene.net,episerver,C#,.net,Inheritance,Lucene.net,Episerver,我的搜索功能中有一个pagetypefilter,并且有一个场景,其中页面b继承自页面a。当我在过滤器列表中选中PageA选项时,我仍然会得到类型为PageB的点击。在EPiServer搜索中是否可以只搜索基类型 b页在我的情况下: public class b : a { public virtual string ExternalUrl { get; set; } [ScaffoldColumn(false)] [JsonIgnore] [S

我的搜索功能中有一个pagetypefilter,并且有一个场景,其中页面b继承自页面a。当我在过滤器列表中选中PageA选项时,我仍然会得到类型为PageB的点击。在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中,我只选中了a类的选项

这是完整的查询

        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();
    }
}

似乎没有实现标准页面过滤器来执行此操作。
但是,您应该能够通过扩展epserver.filters.IPageFilter类来创建自己的过滤器。在文件管理器中,使用检查页面的类型。

我认为问题在于索引。在ContentSearchHandler类中,GetItemType(Type contentType)方法将所有基本类型添加到ItemType字段。由于该方法是公共虚拟的,您应该能够在StructureMap容器中用您自己的实现替换它,该实现只返回基类型。

这是否意味着您要排除所有派生类,在您的情况下,
类b
根本不应该列在结果中?我们还需要了解如何准确地构造a,b对象。很好地编辑了我的问题,通常我会说不。但是你有
contentSearchHandler.GetContent(xxx)并可以根据该结果反映结果。