2009-07-02 13 views
1

Ich benutze Lucene.NET 2.3.1 mit einem MultiSearcher.Warum entfernt Lucene keine Docs?

Zu Testzwecken indexiere ich eine Datenbank mit etwa 10000 Zeilen. Ich habe zwei Indizes und ich wähle zufällig aus, in welche Zeile ich jede Zeile einfügen soll. Das funktioniert korrekt, aber da Lucene keine Update-Fähigkeiten hat, muss ich testen, ob die Zeile existiert (ich habe ein Id-Feld) und dann löschen.

Ich habe eine Liste und eine Liste, und jeder ist mit diesem Code erstellt:

IndexModifier mod = new IndexModifier(path, new StandardAnalyzer(), create); 
m_Modifiers.Add(mod); 
m_Readers.Add(IndexReader.Open(path)); 
m_Searchers.Add(new IndexSearcher(path)); 

nun der Löschcode:

Hits results = m_Searcher.Search(new TermQuery(t)); 

for (int i = 0; i < results.Length(); i++) 
{ 
    DocId = results .Id(i); 
    Index = m_Searcher.SubSearcher(DocId); 
    DocId = m_Searcher.SubDoc(DocId); 

    m_Modifiers[Index].DeleteDocument(DocId); 
} 

Die Suche korrekt ist, und ich bin immer Ergebnisse, wenn Die Zeile existiert. SubSearcher gibt immer 0 oder 1 zurück, wenn Index 0 ist, gibt SubDoc die gleiche ID zurück, und wenn es 1 ist, gibt es die Zahl zurück, die das 5000-fache der Anzahl, die ich den DB indexiert habe, überschritten hat. Es scheint, als würde es nichts löschen.

Jedes Mal, wenn ich die Datenbank indiziere, optimiere und schließe ich die Indizes und Luke sagt, dass es keine ausstehenden Löschungen gibt.

Was könnte das Problem sein?

Antwort

0

Ich bin mir nicht sicher, was das Endziel dieser Aktivität ist, also verzeihen Sie, wenn die folgende Lösung Ihren Anforderungen nicht entspricht.

Wenn Sie zuerst Dokumente löschen möchten, können Sie den IndexReader verwenden, den Sie bereits erstellt haben. IndexModifier ist nicht erforderlich.

Zweitens müssen Sie nicht die Unterordner-ID und die Dokument-ID in diesem Unterordner finden. Sie können auch den Top-Level MultiReader verwenden. Ich würde den entsprechenden Java-Code wie folgt schreiben.

IndexReader[] readers = new IndexReader[size]; 
// Initialize readers 
MultiReader multiReader = new MultiReader(readers); 

IndexSearcher searcher = new IndexSearcher(multiReader); 
Hits results = searcher.search(new TermQuery(t)); 
for (int i = 0; i < results.length(); i++) { 
    int docID = results.id(i); 
    multiReader.deleteDocument(docID); 
} 
multiReader.commit(); // Check if this throws an exception. 
multiReader.close(); 
searcher.close(); 
+0

Danke, endlich habe ich es selbst gelöst. Mein Problem war wirklich ein Feld, das UN_TOKENIZED und TOKENIZED sein sollte. Wenn ich mich richtig erinnere, musste ich, um mit dem multiReader zu löschen, meinen Modifier schließen, und da die meisten Löschvorgänge nur als Teil einer Dokumentaktualisierung ausgeführt werden, möchte ich sie nicht schließen und lösche sie daher direkt mit der Modifikator. Habe ich recht, oder gibt es eine bessere Lösung? –