Frage

Ich bin mit Lucene.Net für die Indizierung und Dokumente zu suchen, und ich bin mit dem folgenden Code einen Index zu erstellen oder zu öffnen, wenn ein solches vorhanden ist:

IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists);

...

private bool IndexExists
{
    get
    {
        return ??
    }
}

Nun, wie kann IndexExists auf einfache Weise implementieren? Ich brauche keine Ausnahmen geworfen werden.

War es hilfreich?

Lösung

Die statische Methode IndexReader.IndexExists (string path) (oder einer seiner Überlastungen) scheint ziemlich geeignet.

Andere Tipps

<4,0 ist IndexReader.indexExists(org.apache.lucene.store.Directory)

> 4.0 ist DirectoryReader.indexExists(org.apache.lucene.store.Directory)

Sie können nur den Konstruktor verwenden, die nicht einen Booleschen param dauert. Das wird einen vorhandenen Index öffnen, wenn es einen gibt oder einen neuen erstellen, wenn es nicht vorhanden ist.

Java Dokumentation Link (gleich für Lucene.Net): http://lucene.apache.org/java/2_3_1/api/org/apache/lucene/index/IndexWriter.html#IndexWriter(org.apache.lucene.store.Directory, org.apache.lucene.analysis.Analyzer)

Ich versuche, diese anwser zu finden auch ohne Erfolg und hier ist, wie ich in meinem Code verwendet:

Private Bool IndexExists     {         bekommen         {             Rück IndexDirectory.FileExists ( "segments.gen");         }     }

ich weiß, dass dies ein alter Eintrag, aber was Sean Carpenter geschrieben ist völlig richtig und dieser Konstruktor existiert auch in der neuesten Version von Lucene .NET. Die Dokumentation für die Indexwriter-Klasse finden Sie hier: http://lucenenet.apache.org/docs/3.0 0,3 / d2 / d1d / class_lucene_1_1_net_1_1_index_1_1_index_writer.html # af4620c14320934601058e0e9cac9bfab

Whoops!

Das ist „gerade Java“ Lucene, aber es kann auch auf andere Sorten.

In Lucene 4.0.0 die API für DirectoryReader.indexExists() sagt

  

Gibt true zurück, wenn ein Index in dem angegebenen Verzeichnis vorhanden ist.

Aber in Lucene 4.10.2 die API für DirectoryReader.indexExists() sagt

  

Gibt true zurück, wenn ein Index in dem angegebenen Verzeichnis wahrscheinlich existiert.   Beachten Sie, dass, wenn eine korrupte Index vorhanden ist, oder wenn ein Index in dem Prozess der   begehen

... ja, es bricht mitten im Satz. Ich NB zusammengestellt meine Javadoc direkt von der Quelle, aber die gleichen unfertigen Sätze sind in dem Online-API zu sehen. Nicht nur das, aber ich sah auf der Lucene 6.0.0 API, und es ist genau das gleiche.

Die "Rückkehr" Phrase ist jedoch:

  

true, wenn ein Index vorhanden ist; andernfalls false

... aber ich glaube, zur Zeit ein leeres Verzeichnis wird manchmal (?) Rückkehr true (aus meinen Unit-Tests). Wie auch immer, ich würde ihm nicht vertrauen.

Wenn Sie eine IndexReader auf ein leeres Verzeichnis zu erstellen, scheint es, dass alle ihre Methoden ohne werfen Ausnahmen zurück. Sie können indexReader.numDocs() gehen, und dies wird 0 zurückgeben, aber das beweist nicht, dass es keinen Index ist, nur, dass es keine Documents. Je nach Bedarf, die genug sein könnte, natürlich.

In ähnlicher Weise können Sie eine IndexSearcher aus einer solchen IndexReader erstellen, und Sie können eine IndexWriter erstellen. Keiner von ihnen wird jedes offensichtliches Problem mit einem leeren Verzeichnis hat.

bessere Lösung:

    try {
        directoryReader = DirectoryReader.open( fsDir );
    } catch ( org.apache.lucene.index.IndexNotFoundException e) {
        ...
    }

Dies scheint, soweit ich das beurteilen kann, zuverlässig zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top