Sitecore Lucene搜索-命中计数与结果计数不同

Sitecore Lucene搜索-命中计数与结果计数不同,lucene,sitecore,sitecore6,Lucene,Sitecore,Sitecore6,我使用以下方法根据提供的查询返回搜索结果 private List GetResults(QueryBase qBase) { 使用(IndexSearchContext sc=SearchManager.GetIndex(“故事”).CreateSearchContext()) { var hits=sc.Search(qBase,int.MaxValue); var h1=hits.FetchResults(0,25); var h2=h1.Select(r=>r.GetObject());

我使用以下方法根据提供的查询返回搜索结果

private List GetResults(QueryBase qBase)
{
使用(IndexSearchContext sc=SearchManager.GetIndex(“故事”).CreateSearchContext())
{
var hits=sc.Search(qBase,int.MaxValue);
var h1=hits.FetchResults(0,25);
var h2=h1.Select(r=>r.GetObject());
var h3=h2。其中(项=>项!=null);
返回h3.ToList();
}
}
正在搜索的索引对web和主内容进行索引。如果我传入一个查询,我知道该查询与一个已发布的项匹配,并在行首断开
var h2=
,那么我会看到变量
hits
有两个项。我希望如此,因为实际上这些项目都是相同的项目,一个来自web,一个来自master

但是,变量
h1
只有一个结果。来自web的结果已被忽略


无论我是在web环境下调试还是在master环境下调试,都是这样。有人能解释一下吗?

当使用
FetchResults
方法获取项目时,Sitecore会根据项目id对lucene中的项目进行分组。第一个项目成为结果
SearchResultCollection
对象中的搜索结果,其他项目成为此结果的
Subresults

例如,如果您有一个id为
{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}
的主项,该主项有一个已发布版本和四个不同语言版本,那么您将从lucene获得此结果的单个结果和四个子结果:

使用(IndexSearchContext sc=SearchManager.GetIndex(“故事”).CreateSearchContext())
{
var hits=sc.Search(qBase,int.MaxValue);
var h1=hits.FetchResults(0,25);
foreach(h1中的搜索结果)
{
var url=result.url;
foreach(result.Subresults中的SearchResult子结果)
{
var subUrl=subresult.Url;//此项的其他版本
}
}
}
在我的例子中,结果和子结果的URL是:

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 GetResults(QueryBase qBase)
{
使用(IndexSearchContext sc=SearchManager.GetIndex(“故事”).CreateSearchContext())
{
var hits=sc.Search(qBase,int.MaxValue);
var h1=hits.FetchResults(0,25);
var h2=h1.Select(r=>r.GetObject()).ToList();
//将项目的其他版本添加到结果列表中
foreach(h1.Select中的IEnumerable子结果(sr=>sr.subresults))
{
h2.AddRange(subresults.Select(r=>r.GetObject());
}
var h3=h2。其中(项=>项!=null);
返回h3.ToList();
}
}

您不能假设with项将作为lucene中的第一个项返回,并且哪些项将作为子结果返回。如果要获取任何特定项目,需要将版本号、语言和数据库传递给查询。

一个完美的答案。非常感谢。