2013-02-19 25 views
6

Pracuję na drodze do Lucene i byłem zaskoczony tą kwestią za pomocą obiektu Hits. Używam Lucene.Net.Search, ale z jakiegoś powodu VS12 Express nie może znaleźć obiektu Hits, więc poniższe nie uda się skompilować.Hits Obiekt przestarzały w Lucene.Net 3.03, jak mogę go zastąpić?

Kompilator narzeka na tej linii

Hits hits = searcher.Search(booleanQuery, hits_limit); 

z następującym komunikatem o błędzie

Błąd 1 typu lub obszaru nazwa „Hits” nie można znaleźć (czy brakuje using dyrektywa lub odniesienie do zespołu?)

Nie rozumiem, zgodnie z tutoriali online alk, których potrzebujesz, to Lucnen.Ne t.Search

Wszelkie znane

// validation 
if (subqueries.Count == 0) return new List<MATS_Doc>(); 
// set up lucene searcher 
Searcher searcher = new IndexSearcher(_directory, false); 
var hits_limit = 1000; 
var analyzer = new StandardAnalyzer(Version.LUCENE_30); 
BooleanQuery booleanQuery = new BooleanQuery(); 
foreach (Query fieldQuery in subqueries) 
{ 
    booleanQuery.Add(fieldQuery, Occur.SHOULD); 
} 
//var parser = new QueryParser(Version.LUCENE_30, searchField, analyzer); 
//var query = _parseQuery(searchQuery, parser); 
Hits hits = searcher.Search(booleanQuery, hits_limit); 
IEnumerable<MATS_Doc> results = _mapLuceneSearchResultsToDataList(hits, searcher); 
analyzer.Close(); 
searcher.Dispose(); 
return results; 

Odpowiedz

15

użyć Lucene.net 3.0.3 i wyszukiwania() zwraca TopDocs przedmiot, który zawiera kilka właściwości i szereg elementów ScoreDoc. Oto przykład:

Lucene.Net.Search.TopDocs results = searcher.Search(booleanQuery, null, hits_limit); 


foreach(ScoreDoc scoreDoc in results.ScoreDocs){ 
    // retrieve the document from the 'ScoreDoc' object 
    Lucene.Net.Documents.Document doc = searcher.Doc(scoreDoc.Doc); 
    string myFieldValue = doc.get("myField"); 
} 
+0

Dzięki! czy mimo to odzyskać cały dokument za jednym razem, a nie za pole? – TheCodeNovice

+0

wiersz ** Lucene.Net.Documents.Document doc = searcher.Doc (scoreDoc.Doc); ** pobiera cały dokument. Następnie możesz uzyskać dostęp do jego pól, tak jak zrobiłem to w moim przykładzie, lub iterować je za pomocą czegoś takiego jak foreach ** (Lucene.Net.Documents.Field f in doc.GetFields()) {Console.WriteLine ("field =" + f.Nazwa + ", wartość =" + f.StringValue)} ** – mbarthelemy

+0

idealne! dzięki jeszcze raz – TheCodeNovice