當使用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