EPiServer搜索仅搜索基本类型

时间:2016-12-08 10:27:51

标签: c# .net inheritance lucene.net episerver

我的搜索功能中有一个pagetypefilter,并且页面b继承自第a页。当我在我的过滤器列表中检查页面中的一个选项时,我仍然会得到类型为页面b的命中。是否可以仅在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();
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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