2014-09-28 52 views
4

我想我在Lucene的結果lucene.net排序不工作訪問衝突

我不斷收到此錯誤然而

型「System.AccessViolationException」未處理的異常發生在Search.dll

排序

附加信息:試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。

我曾嘗試設置Field.Index進行分析,但沒有分析,但沒有喜悅。

Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29); 

var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Title", analyzer); 
Query query = parser.Parse(searchTerm.Trim() + "*"); 

var searcher = new IndexSearcher(directory, true); 

var sortBy = new Lucene.Net.Search.Sort(new Lucene.Net.Search.SortField("Title", Lucene.Net.Search.SortField.STRING, true)); 

var filter = new QueryWrapperFilter(query); 
// TopDocs topDocs3 = searcher.Search(query, filter, 500,sortBy); 
// TopDocs topDocs = searcher.Search(query,500); 
TopDocs topDocs2 = searcher.Search(query,null, 500, new Sort(new SortField("Title", SortField.STRING))); 

var re = searcher.Search(query, null, 10, new Sort(new SortField("id", SortField.INT, true))); 

回答

0

我在嘗試在LUCENE_30中訂購搜索結果時遇到了同樣的錯誤。我必須說,我寫這個例子很匆忙,沒有經過測試。 我做了以下幾件事:

string sortText = Enum.GetName(typeof(SortableFields), sortBy); 
     SortField field = new SortField(sortText, SortField.STRING, sortDesc); 
     var sortByField = new Lucene.Net.Search.Sort(field); 
     TopFieldCollector collector = Lucene.Net.Search.TopFieldCollector.Create(sortByField, MaxSearchResultsReturned, false, false, false, false); 

     using (Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)) 
     { 
      var queryParse = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, IndexFields.FullText, analyzer); 
      queryParse.AllowLeadingWildcard = true; 
      Query query = queryParse.Parse(searchText); 
      using (var searcher = new IndexSearcher(directory, true)) 
      { 
       searcher.Search(query, collector); 
       totalRows = collector.TotalHits; 
       TopDocs matches = collector.TopDocs(skip, take); 

       // convert results to known objects 

       var results = new List<SearchResult>(); 
       foreach (var item in matches.ScoreDocs) 
       { 
        int id = item.Doc; 
        Document doc = searcher.Doc(id); 
        SearchResult result = new SearchResult(); 
        result.ID = doc.GetField("ID").StringValue; 
        results.Add(result); 
       } 
      } 
     } 

       return results;