검색 기능에 pagetype 필터가 있고 페이지 b가 페이지 a에서 상속받는 시나리오가 있습니다. 내 filterlist에서 페이지 옵션을 검사 할 때 나는 여전히 페이지 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; }
}
및 페이지 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에 나는 단지
여기 전체 쿼리
의 클래스에 대한 옵션을 체크 한 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 자체 :
모든 파생 된 클래스를 제외하려면 '클래스 b'가 결과에 전혀 나열되어서는 안됩니다. 우리는 또한 당신이 당신의 물건을 어떻게 구성 하는지를 알아야합니다. –
정확합니다. 내 질문 편집 –
글쎄, 일반적으로 OOTB 나는 안된다고. 그러나 당신은'contentSearchHandler.GetContent (xxx); '을 가지고 있으며 결과를 반영하기 위해 그 결과로 작업 할 수 있습니다. –