2010-04-14 3 views
5

Ich bin ein tagging system for my siteWie lösche/aktualisiere ich ein Dokument mit Lucene?

zu schaffen habe ich die Grundlagen ein Dokument des Hinzufügens Lucene, aber ich kann scheinen, um herauszufinden, wie ein Dokument zu löschen oder eine Aktualisierung, wenn der Benutzer die Tags von etwas ändert. Ich habe Seiten gefunden, die sagen, dass ich den Dokument-Index verwende und ich muss vor dem Effekt optimieren, aber wie bekomme ich den Dokumentenindex? Auch ich sah ein anderes, das sagte, IndexWriter zu benutzen, um zu löschen, aber ich konnte nicht herausfinden, wie man es damit auch tut.

I C# asp.net verwende und ich nicht Java auf dem Rechner installiert

Antwort

10

Welche Version von Lucene verwenden Sie? Die IndexWriter-Klasse verfügt über eine Update-Methode, die Sie aktualisieren können (BTW ein Update unter der Haube ist wirklich ein Löschen, gefolgt von einem Hinzufügen). Sie müssen eine Kennung (z. B. als Dokument-ID) haben, die Sie aktualisieren können. Wenn Sie das Dokument indizieren, fügen Sie eine eindeutige Dokument-ID hinzu, z. B. eine URL, einen Zähler usw. Dann ist der "Begriff" die ID des Dokuments, das Sie aktualisieren möchten. Zum Beispiel mit URL können Sie so aktualisieren:

IndexWriter writer = ... 
writer.update(new Term("id","http://somedomain.org/somedoc.htm"), doc); 
+0

Incubating-Apache-Lucene.Net-2.0-004-11Mar07.bin.zip. Also vielleicht Lucene 2.0. –

+0

Huch, ich habe gerade das Datum erkannt. Ich fand ein SVN-Tag mit Lucene.Net_2_9_1 –

+0

Nur damit ich klar bin. Doc ist das neue Dokument, das mit den gewünschten Daten gefüllt ist. Der Begriff ist die ID des alten Dokuments, das ich aktualisieren/ersetzen möchte? -edit-update sieht wie ein DeleteAdd aus. Doc muss nicht dieselbe ID oder denselben Begriff wie der ältere halten. –

3

Sie benötigen ein IndexReader ein Dokument zu löschen, bin ich über die .net-Version nicht sicher, aber die Java und C++ Versionen Die Lucene-API hat eine IndexModifier Klasse, die die Unterschiede zwischen IndexReader und IndexWriter Klassen verbirgt und nur die entsprechende verwendet, wie Sie addDocument() und removeDocument() aufrufen.

Auch gibt es kein Konzept der Aktualisierung eines Dokuments in Lucene Sie müssen es entfernen und sie erneut hinzufügen. Um dies zu tun, müssen Sie sicherstellen, dass jedes Dokument eine eindeutige gespeicherte ID im Index hat.

+0

super, über Updates zu wissen. Ich sehe removeDocument noch IndexModifier (vielleicht verwendet .net eine ältere Version von Lucene). Ich sehe ein DeleteDocument in IndexReader. Es akzeptiert 'int docNum'. Ich habe keine Ahnung was ich damit anfangen soll. Theres kein docNum oder docId in Dokument –

+1

das Dokument ist der Enumeratorschlüssel, zum Beispiel IndexReader rdr = IndexReader.Open (@ "Myindex"); int N = rdr.MaxDoc(); für (int n = 0; n Mikos