我有以下方法根据提供的查询返回搜索结果
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>());
var h3 = h2.Where(item => item != null);
return h3.ToList();
}
}
正在搜索的索引为web和master内容编制索引。如果我传入一个我知道匹配单个已发布项目的查询并在var h2 =
开始的行中断,那么我看到变量hits
有2个项目。我希望这是因为实际上这些项目都是相同的项目,一个来自网络,另一个来自主。
但是,变量h1
只有一个结果。来自web的结果已被省略。
无论我是在web或master的上下文中调试,都是这种情况。谁能解释一下?
答案 0 :(得分:1)
使用FetchResults
方法获取项目时,Sitecore会根据项目的ID将lucene中的项目分组。第一个项目在生成的SearchResultCollection
对象中成为SearchResult,其他项目变为Subresults
以获得此结果。
例如,如果您有一个标识为{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中的第一个返回,哪些项目将作为子结果返回。如果要获取任何特定项目,则需要将版本号,语言和数据库传递给查询。