2009-08-18 2 views
3

In lucene kann ich folgendesdie Doc-ID in Lucene Erste

doc.GetField("mycustomfield").StringValue(); 

tun, den Wert einer Spalte in einem Index des Dokuments Diese abruft.

Meine Frage, für die gleiche 'doc', gibt es eine Möglichkeit, die Doc. Id zu bekommen? Luke zeigt es an, daher muss es einen Weg geben, das herauszufinden. Ich brauche es, um Dokumente auf Updates zu löschen.

Ich habe die Dokumente durchforstet, aber den Begriff in GetField nicht gefunden oder wenn es bereits eine andere Methode gibt.

+2

Die innere Lucene-ID ist nicht in Stein gemeißelt. Eine bessere Möglichkeit zum Löschen von Dokumenten besteht darin, eine eindeutige ID als eines der Felder des Dokuments zu speichern und sie mit ihrem Wert zu löschen. –

+0

Wie in Lucene 3.0 Hits Klasse ist veraltet, kann jemand vorschlagen, wie die Doc-ID in weiteren Versionen zu bekommen? Vielen Dank. – Emma

Antwort

2

Stellt sich heraus, Sie, dies zu tun haben:

var hits = searcher.Search(query); 
var result = hits.Id(0); 

Im Gegensatz zu

var results = hits.Doc(i); 
var docid = results.<...> //there's nothing I could find there to do this 
1

ich den Grund vermuten, sind Sie Schwierigkeiten, alle Unterlagen über die Bestimmung der ID eines bestimmten Lucene Dokument zu finden, die ist, weil sie nicht wirklich "id" s sind. Mit anderen Worten, sie sind nicht notwendigerweise dazu gedacht, nachgeschlagen und für eine spätere Verwendung gespeichert zu werden. In der Tat, wenn Sie dies tun, werden Sie nicht die Ergebnisse erhalten, die Sie erhofft haben, da sich die IDs ändern, wenn der Index optimiert wird.

Stellen Sie sich stattdessen die IDs als den aktuellen "Offset" eines bestimmten Dokuments vom Anfang des Indexes vor, der sich ändert, wenn gelöschte Dokumente physisch aus den Indexdateien entfernt werden.

Jetzt mit dieser sagte, der richtige Weg, die „id“ eines Dokuments zu sehen ist:


QueryParser parser = new QueryParser(...); 
IndexSearcher searcher = new IndexSearcher(...); 
Hits hits = searcher.Search(parser.Parse(...); 

for (int i = 0; i < hits.Length(); i++) 
{ 
    int id = hits.Id(i); 

    // do stuff 
}