我的搜索功能中有一个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();
}
}
答案 0 :(得分:0)
看起来没有实现标准的pagefilter来执行此操作。 但是您应该能够通过扩展EPiServer.Filters.IPageFilter类来创建自己的过滤器。在您的文件管理器中,使用Type.IsSubclassOf检查页面的类型。
答案 1 :(得分:0)
我认为问题在于索引。在ContentSearchHandler类中,方法GetItemType(Type contentType)将所有基类型添加到ItemType字段。由于该方法是公共虚拟的,因此您应该能够在StructureMap容器中用您自己的实现替换它,该容器只返回基类型。