2014-09-22 83 views
1

不同,我有以下方法返回根据提供的查询Sitecore的Lucene搜索 - 命中次数从结果计数

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(); 
    } 
} 

搜索结果索引被搜索网站的索引和掌握的内容。如果我传递一个我知道的查询匹配单个已发布项并在开头var h2 =开始的行中断,那么我看到变量hits有2个项目。这是我期望的,因为实际上这些项目都是相同的项目,一个来自网页,另一个来自主页。

但是,变量h1只有一个结果。来自网络的结果已被省略。

无论我是在web还是master上下文中调试,都是这种情况。谁能解释一下?

回答

1

当使用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中的第一个返回,并且哪些项目将作为子结果返回。如果您想获取任何特定项目,则需要将版本号,语言和数据库传递给查询。

+0

一个完美的答案。谢谢。 – getsetcode 2014-09-23 12:02:29