当使用FetchResults
方法提取项目时,Sitecore通过项目的ID对lucene中的项目进行分组。第一个项目在结果SearchResultCollection
对象中变成搜索结果,其他项目变为Subresults
。
例如,如果你有一个家庭项目与ID {110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}
一个发布版本和4个版本为家庭项目不同的语言,你会从Lucene的获得是一个结果和4子结果对于这个结果:
using (IndexSearchContext sc = SearchManager.GetIndex("story").CreateSearchContext())
{
var hits = sc.Search(qBase, int.MaxValue);
var h1 = hits.FetchResults(0, 25);
foreach (SearchResult result in h1)
{
var url = result.Url;
foreach (SearchResult subresult in result.Subresults)
{
var subUrl = subresult.Url; // other versions of this item
}
}
}
在我的情况下,结果和子结果的网址是:
sitecore://web/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}?lang=en&ver=1
sitecore://master/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}?lang=en&ver=1 (subresult)
sitecore://master/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}?lang=ja-JP&ver=1 (subresult)
sitecore://master/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}?lang=de-DE&ver=1 (subresult)
sitecore://master/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}?lang=da&ver=1 (subresult)
所以检索所有与它们的版本的项目,你可以使用此代码:
private List<Item> GetResults(QueryBase qBase)
{
using (IndexSearchContext sc = SearchManager.GetIndex("story").CreateSearchContext())
{
var hits = sc.Search(qBase, int.MaxValue);
var h1 = hits.FetchResults(0, 25);
var h2 = h1.Select(r => r.GetObject<Item>()).ToList();
// add other versions of item to the resulting list
foreach (IEnumerable<SearchResult> subresults in h1.Select(sr => sr.Subresults))
{
h2.AddRange(subresults.Select(r => r.GetObject<Item>()));
}
var h3 = h2.Where(item => item != null);
return h3.ToList();
}
}
您不能假定项目将作为lucene中的第一个返回,并且哪些项目将作为子结果返回。如果您想获取任何特定项目,则需要将版本号,语言和数据库传递给查询。
一个完美的答案。谢谢。 – getsetcode 2014-09-23 12:02:29