検索機能にpagetypefilterがあり、ページbがページaから継承するシナリオがあります。私は私のフィルタリストのオプションをページにチェックすると、まだタイプがページ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; }
}
とページ
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自身:
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();
}
}
これは、すべての派生クラスを除外することを意味しますか?あなたのケースでは、 'class b'は結果に全くリストされていないはずですか?私たちはまた、あなたのa、bオブジェクトをどのように構築するかを知る必要があります。 –
正確です。私の質問を編集しました –
よく、一般的にOOTBはいいえと言います。しかし、あなたは 'contentSearchHandler.GetContent(xxx); 'を持っていて、その結果から結果を反映させることができます。 –