【发布时间】:2015-09-10 09:53:34
【问题描述】:
我有一个名为ArticlePageTemplate 的页面模板。这个ArticlePageTemplate 包含一个名为Articles 的组件。 Article 组件具有名为 Header、SubHeader、Date 和 Content 的数据字段。
ArticlesPageTemplate的介绍详情
在sitecore 8中使用Lucene。如何获取所有ArticlePageTemplate,其中包含Article组件子标题中值为“News”的Article组件。
网站核心结构:
这是我的代码
public class LuceneSearchService : ILuceneSearchService, IDisposable
{
bool disposed = false;
// Instantiate a SafeHandle instance.
SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);
private IProviderSearchContext _SearchContext;
private ISearchIndex _Index;
private string _IndexName = "sitecore_web_index";
public string IndexName
{
get { return _IndexName; }
set { _IndexName = value; }
}
public LuceneSearchService()
{
_Index = ContentSearchManager.GetIndex(this.IndexName);
_SearchContext = _Index.CreateSearchContext();
}
public IQueryable<SearchResultItem> PerformSearch(string searchPath)
{
var searchQuery = _SearchContext.GetQueryable<SearchResultItem>()
.Where(i => i.Path.StartsWith(searchPath));
return searchQuery;
}
public IQueryable<SearchResultItem> PerformSearch(string searchPath, string templateName)
{
var searchQuery = PerformSearch(searchPath).Where(x => x.TemplateName == templateName);
return searchQuery;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
handle.Dispose();
_SearchContext.Dispose();
_Index.Dispose();
}
// Free any unmanaged objects here.
//
disposed = true;
}
}
代码实现
public void SearchArticles()
{
var articles = SearchService.PerformSearch("/sitecore/content", "ArticlePageTemplate").ToList();
foreach (var article in articles){
var articleName = article;
}
}
我可以使用上面的代码获取所有ArticlesPageTemplate,但我无法过滤它以仅获取那些包含Article 组件的ArticlePageTemplate,其中Article 组件的子标题是“新闻”。
我不知道如何获取 ArticlePageTemplate 的文章组件,因此我可以将它们添加到我在 lucene 中的搜索查询中。
感谢任何建议。
注意:
ArticlesComponent 的数据源可能会发生变化,因此它并不总是ArticlesPageTemplate 的子级。
更新(2015 年 9 月 11 日)
我尝试了 Richard 的建议,但没有奏效。
var articles = SearchService
.PerformSearch<ArticleResultItem>("/sitecore/content", "ArticlePageTemplate")
.Where(item => item.SubHeader == "News").ToList();
使用上面的查询不会产生任何结果,但使用下面的查询会返回一个结果,但它检索的是 ArticleComponent 而不是 ArticlePageTemplate。
var articles = SearchService
.PerformSearch<ArticleResultItem>("/sitecore/content"
.Where(item => item.SubHeader == "News").ToList();
解决方案:
计算字段有效。从以下链接查看 VisualizationField.cs:
【问题讨论】:
标签: c# sitecore lucene.net sitecore8 sitecore-lucene