2014-09-22 47 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