So löschen Sie Dokumente aus einem Lucene-Index mit Laufzeit oder QueryParser
Ich versuche zum löschen von Dokumenten aus dem Lucene-Index.
Ich will nur das löschen der angegebenen Datei von lucene-index .
Meinem folgenden Programm ist das löschen des index, der durchsucht werden können durch die Verwendung von keyword analyzer, aber meine gewünschten Dateinamen durchsucht werden kann nur mit StandardAnalyzer . So ist es ein Weg, um standard-analyzer in meiner Amtszeit oder anstelle von Begriff wie kann ich Benutzer QueryParser zum löschen der Dokumente aus dem lucene-index.
try{
File INDEX_DIR= new File("D:\\merge lucene\\abc\\");
Directory directory = FSDirectory.open(INDEX_DIR);
IndexReader indexReader = IndexReader.open(directory,false);
Term term= new Term("path","fileindex23005.htm");
int l= indexReader.deleteDocuments(term);
indexReader.close();
System.out.println("documents deleted");
}
catch(Exception x){x.printStackTrace();}
InformationsquelleAutor adesh singh | 2013-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie sind mit Lucene 3.6 oder früher, sonst
IndexReader.deleteDocuments
ist nicht mehr vorhanden. Sollten Sie jedoch mit IndexWriter statt, sowieso.Wenn Sie nur finden können, das Dokument mithilfe von query parser, dann führen Sie einfach eine normale Abfrage, dann Durchlaufen Sie die Dokumente zurückgegeben, und löschen Sie Sie von docnum, entlang der Linien von:
Oder noch besser (einfacher, verwendet nicht-aufgelösten, nicht-deprecated Funktionen), verwenden Sie einfach einen
IndexWriter
, und übergeben Sie die Abfrage direkt:Ja, Streichungen sind nicht sofort eliminiert aus der Datei-Struktur. Sie werden im Speicher gepuffert zeitweise (kontrolliert
IndexWriterConfig
), und diese dann auch effektiv als gelöscht markiert sind. Schließlich Löschungen gespült werden, aus dem index, wie in IhreMergePolicy
. Die Löschung kann eine teure operation sein, ich würde nicht empfehlen, versuchen, es zu verschmelzen, jedes mal, wenn ein Löschvorgang empfangen wurde, vor allem, wenn die Löschung ist eine ziemlich häufige operation.nach dem löschen des Dokuments aus dem index-Dateien, wenn ich die Abfrage den index, wird es wieder die gelöschten Datensätze auch?
Wenn Sie zu löschen, dann index.Commit () auf, die Löschung spiegelt sich in jedem neuen Leser erstellt, sagte Index - die gelöschten Datensätze werden nicht zurückgegeben.
InformationsquelleAutor femtoRgon
Hinzufügen für zukünftige Referenz für jemanden wie mich, wo das löschen von Dokumenten ist auf indexWriter , können Sie
anstatt deleteDocuments(query) - Methode; haben weniger ärger, wenn Sie haben mit nur einem Feld. Werden-bewusst, dass diese Methode behandelt die Begriffe als ODER-Bedingung, wenn mehrere Bedingungen übergeben werden. So wird es entsprechen jeder Begriff, und löscht alle Datensätze. Der folgende code match state=Tx, die in Dokumenten gespeichert sind und löschen, die passenden Datensätze.
Zur Kombination der verschiedenen Felder mit UND Zustand können, verwenden wir folgenden code:
doc.add(new TextField("uid", product.getUid(), Field.Store.YES));
aber wenn ich versuche zu löschen, das Dokument alsTerm term = new Term("uid", uniqueId); getIndexWriter().deleteDocuments(term);
wirft eine NPE-ich habe versucht, sowohl dieTextField
undStringField
und die geben alle eine NPE. Wo mache ich falsch bitte. Mit Lucene 5.4InformationsquelleAutor dillip pattnaik
Als @dillippattnaik wies darauf hin, mehrere Begriffe führen ODER. Ich habe aktualisiert seinen code zu machen, UND mit BooleanQuery:
InformationsquelleAutor Gerhard Powell