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

时间:2014-09-22 11:43:05

标签: lucene sitecore sitecore6

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

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的上下文中调试,都是这种情况。谁能解释一下?

1 个答案:

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