2013-09-25 2 views
3

Недавно мы обновились до Sitecore 6.6 и столкнулись с проблемами, связанными с функциями поиска и сканирования от Lucene, так как 6.6 использует более новую версию и некоторые из методов/функций устарели.Проблема с обновлением Sitecore 6.6 и Lucene

Код, используемый для работы с предыдущей версией 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; 
} 

Благодаря

ответ

4

Sitecore 6.6Lucene 2.9. Ниже приведен код, обновленный для поддержки новой версии Lucene. Есть 2 основные изменения:

  1. Search метод выполняется с 2-х дополнительных параметров (Filter, который установлен в null и maxDocs который установлен на int.MaxValue).
  2. SearchHits конструктор принимает IndexReader экземпляр как второй параметр.

Код ниже должен работать точно так, как вы ожидаете.

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); 
} 
+0

Сделано изменение. Ложись! :) – Gabbar

+0

С вашим кодом, я получаю следующую ошибку - Недопустимое значение сдвига в префиксе Кодированная строка (закодированное значение действительно INT?) – Gabbar

+0

Любая stacktrace? Просто нашел на google парня, у которого была такая же проблема, как и вы и его ответ: «Я индексирую double для поля Numeric, но мой Sortfield был настроен как float». –

3

Не очень знакомы с Sitecore, но Searcher.search(Query, Sort) осуждался в Lucene 2.9, и похоже, не присутствовал на всех в Lucene.Net. Вместо этого позвоните по номеру Searcher.search(Query, Filter, int, Sort). Второй аргумент (Filter) может быть нулевым, а третий (int) указывает количество документов, возвращаемых из поиска.

Смежные вопросы