Sitecore 6.6和Lucene升级问题

时间:2013-09-25 18:16:21

标签: lucene sitecore lucene.net sitecore6

我们最近升级到Sitecore 6.6并且遇到了来自Lucene的搜索和抓取功能的问题,因为6.6使用的是更新的版本,并且某些方法/功能已经过时。

下面的代码曾经与之前版本的Lucene.NET 2.3一起使用,但在2.9版本中无效。你能告诉我们我们做错了什么并帮助我们纠正这段代码吗?我们在编译时得到的错误是

`Lucene.Net.Search.IndexSearcher` does not contain a definition for 'Search'
and no extension method 'Search' accepting a first argument of type 
`Lucene.Net.Search.IndexSearcher` could be found (are you missing a using 
directive or an assembly reference?) 

此行发生此错误 - Sitecore.Search.SearchHits hits = new SearchHits(context.Searcher.Search(query,sort));。我猜这将是一个简单的修复,但我不确定如何修复它。

private static SearchResultCollection GetSearchResults(Query query, Sort sort, int startingIndex, int getCount, out int totalHits)
{
    SearchResultCollection retVal = new SearchResultCollection();
    Sitecore.Search.Index searchIndex = Sitecore.Search.SearchManager.GetIndex("content");
    using (Sitecore.Search.IndexSearchContext context = searchIndex.CreateSearchContext())
    {
        Sitecore.Search.SearchHits hits = new SearchHits(context.Searcher.Search(query,sort));
        totalHits = hits.Length;
        //since index is zero based... adjust the numbers 
        startingIndex = (startingIndex - 1) * getCount;
        getCount = (getCount > totalHits || totalHits < startingIndex + getCount) 
            ? hits.Length - startingIndex : getCount;
        retVal = hits.FetchResults(startingIndex, getCount);
    }
    return retVal;
}

由于

2 个答案:

答案 0 :(得分:4)

Sitecore 6.6 使用 Lucene 2.9 。以下代码是您更新的代码,以支持较新版本的 Lucene 。有两个主要变化:

  1. Search方法使用2个附加参数执行(Filter设置为nullmaxDocs设置为int.MaxValue
  2. SearchHits构造函数将IndexReader实例作为第二个参数。
  3. 下面的代码应该与您期望的完全一致。

    using (Sitecore.Search.IndexSearchContext context = searchIndex.CreateSearchContext())
    {
        TopFieldDocs docs = context.Searcher.Search(query, null, int.MaxValue, sort);
        Sitecore.Search.SearchHits hits = new SearchHits(docs, context.Searcher.GetIndexReader());
        totalHits = hits.Length;
        startingIndex = (startingIndex - 1) * getCount;
        getCount = (getCount > totalHits || totalHits < startingIndex + getCount) ? hits.Length - startingIndex : getCount;
        retVal = hits.FetchResults(startingIndex, getCount);
    }
    

答案 1 :(得分:3)

对Sitecore并不十分熟悉,但Searcher.search(Query, Sort)在Lucene 2.9中已被弃用,看起来在Lucene.Net中根本不存在。相反,请致电Searcher.search(Query, Filter, int, Sort)。第二个参数(Filter)可以为null,第三个参数(int)表示从搜索中返回的文档数。