C# EPiServer搜索仅搜索基类型
我的搜索功能中有一个pagetypefilter,并且有一个场景,其中页面b继承自页面a。当我在过滤器列表中选中PageA选项时,我仍然会得到类型为PageB的点击。在EPiServer搜索中是否可以只搜索基类型 b页在我的情况下: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
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)代码>并可以根据该结果反映结果。