2013-02-19 3 views
6

Ich arbeite mich durch Lucene und war auf dieses Problem mit dem Hits-Objekt ratlos. Ich habe eine Verwendung von Lucene.Net.Search, aber aus irgendeinem Grund kann der VS12 Express das Hits-Objekt nicht finden, so dass der folgende Code nicht kompiliert werden kann.Hits Objekt in Lucene.Net 3.03 veraltet, wie ersetze ich es?

Der Compiler beschwert sich über diese Linie

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

mit der folgenden Fehlermeldung

Fehler 1 Der Typ oder Namespace-Name ‚Hits‘ konnte nicht gefunden werden (sind Sie eine using-Direktive fehlt oder eine Assembly-Referenz?)

Ich verstehe es nicht, nach den Online-Tutorials Alk, die Sie brauchen, ist Lucnen.Ne t.Search

Jede Beratung

// 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; 

Antwort

15

Ich benutze Lucene.net 3.0.3 und Search() gibt einen TopDocs Objekt, das ein paar Eigenschaften und eine Reihe von ScoreDoc Elemente enthält. Hier ist ein Beispiel:

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

Vielen Dank! Gibt es trotzdem eine Möglichkeit, das gesamte Dokument im Gegensatz zu Feld für Feld wieder auf einen Schlag zu bringen? – TheCodeNovice

+0

die Zeile ** Lucene.Net.Documents.Document doc = searcher.Doc (scoreDoc.Doc); ** ruft das gesamte Dokument ab. Dann können Sie wie in meinem Beispiel auf seine Felder zugreifen oder sie mit Hilfe von etwas wie ** foreach (Lucene.Net.Documents.Field f in doc.GetFields()) {Console.WriteLine ("field =" +) durchlaufen f.Name + ", Wert =" + f.StringValue)} ** – mbarthelemy

+0

perfekt! Danke noch einmal – TheCodeNovice

Verwandte Themen