2014-09-28 62 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;