2016-01-24 54 views
0

我有一个索引正在生成完全正常(可以浏览所有创建的项目通过卢克)。在Luke中做了一个查询,甚至设法返回结果 - 在C#中的下面的代码中实现,但不返回。有什么明显的,我失踪了。Lucene在Sitecore中搜索;没有结果返回

  totalResults = 0; 
     using (var context = ContentSearchManager.GetIndex("custom_search_index").CreateSearchContext()) 
     { 
      var filterPredicate = PredicateBuilder.True<SearchItem>(); 
      var termPredicate = PredicateBuilder.False<SearchItem>(); 

      termPredicate = termPredicate 
           .Or(p => p.Name.Like(keyword, 0.75f)).Boost(2.0f) 
           .Or(p => p.Excerpt.Like(keyword)) 
           .Or(p => p.SearchTags.Like(keyword)) 
           .Or(p => p.HtmlContent.Like(keyword)); 

      var predicate = filterPredicate.And(termPredicate); 
      var query = context.GetQueryable<SearchItem>().Where(predicate); 

      var results = query.Page(page, itemsPerPage).GetResults(); 

      totalResults = results.TotalSearchResults; 
      var result = results.Hits.Select(h => GetPage(h.Document)).ToArray(); 

      return result; 
     } 
在Search.Log

,我发现了以下打

ExecuteQueryAgainstLucene(custom_search_index):_name:20世纪80年代〜0.75摘录:1980 searchtags:20世纪80年代h​​tmlcontent:1980 - 过滤器:

如果我在卢克运行'_name:1980s〜0.75节选:20世纪80年代searchtags:20世纪80年代h​​tmlcontent:20世纪80年代',我确实得到了一个结果!

+1

可以肯定的是,您是否在相同的自定义索引上使用了Luke,即'custom_search_index'? 'totalResults'也是0,'GetPage()'函数返回什么? –

+0

是在两个实例中使用相同的索引。 GetPage()将项目映射到Sitecore项目以获取更多详细信息。 – Daniel

+1

问题只与'80年代'有关吗?你尝试过使用字母查询吗? –

回答

0

所以,如果我使用下面的代码:

var results = query.Page(page, itemsPerPage).GetResults(); 

其中页面1和itemsPerPage是5,但我的筛选结果只返回一个值(或小于itemsPerPage)GetResults()返回没有结果!

+2

你试过'page = 0'吗? –

+1

是的,'页面'值是从零开始的。 'Page(..)'扩展方法的代码是这样的:'Queryable.Take (Queryable.Skip (source,page * pageSize),pageSize)'所以它会首先跳过1 * 5然后'拿5件物品。 –

1

大多数情况下,这表示索引已过期。例如,结果指出的项目已被删除或尚未发布。重建索引应导致Luke和Sitecore返回相同。

此外,检查您的分页是否不排除结果。也许先尝试不用分页。

+0

如果我删除了查询中的where子句,我确实得到了所有的页面!所以问题似乎是关于过滤部分。 – Daniel

+1

或者在分页部分,因为没有过滤,你可能会得到很多满足分页参数的结果。 –

+0

这很奇怪,如果我过滤并排除寻呼机它返回一个匹配(因为它应该)!如果有一个结果,为什么传呼机不会返回? – Daniel

1

从其他评论看来,你似乎正在使用page = 1获得结果的第一页。

page参数是从零开始,这意味着如果你想在第一页,你必须使用0

// This will return the first 5 results (page 1) 
query.Page(0, 5).GetResults(); 

// This will return the next 5 results (page 2) 
query.Page(1, 5).GetResults(); 

这可以通过查看该Page(..)扩展方法的代码进行验证:

return Queryable.Take<TSource>(Queryable.Skip<TSource>(source, page * pageSize), pageSize); 
+0

谢谢,是的后语意识到它是零基础! – Daniel