Pregunta

Estoy usando Lucene.Net para indexar y buscar documentos, y estoy usando el siguiente código para crear o abrir un índice si existe:

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

...

private bool IndexExists
{
    get
    {
        return ??
    }
}

Ahora, ¿cómo puede implementar IndexExists de una manera simple? No necesito ninguna excepción para lanzar.

¿Fue útil?

Solución

El método estático IndexReader.IndexExists (ruta de cadena) (o una de sus sobrecargas) parece bastante adecuado.

Otros consejos

En < 4.0 es IndexReader.indexExists(org.apache.lucene.store.Directory)

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

Podrías usar el constructor que no toma un parámetro booleano. Eso abrirá un índice existente si hay uno allí o creará uno nuevo si no existe.

Enlace de documentación de Java (igual para 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)

Intento encontrar esta respuesta también sin éxito y así es como lo usé en mi código:

private bool IndexExists     {         obtener         {             return IndexDirectory.FileExists (" segmentos.gen ");         }     }

Sé que esta es una entrada antigua, pero lo que Sean Carpenter publicó es totalmente correcto y este constructor existe incluso en la última versión de Lucene .NET. La documentación para la clase IndexWriter se puede encontrar aquí: http://lucenenet.apache.org/docs/3.0 .3 / d2 / d1d / class_lucene_1_1_net_1_1_index_1_1_index_writer.html # af4620c14320934601058e0e9cac9bfab

¡Vaya!

Esto es & "; Java directo &"; Lucene, pero puede aplicarse a otras variedades.

En Lucene 4.0.0 la API para DirectoryReader.indexExists() dice

  

Devuelve verdadero si existe un índice en el directorio especificado.

Pero en Lucene 4.10.2 la API para true dice

  

Devuelve verdadero si es probable que exista un índice en el directorio especificado.   Tenga en cuenta que si existe un índice corrupto, o si hay un índice en proceso de   cometer

... sí, se interrumpe a mitad de la oración. Nota: compilé mi Javadoc directamente desde la fuente, pero la misma frase sin terminar se puede ver en la API en línea. No solo eso, sino que miré la Lucene 6.0.0 API, y es exactamente lo mismo.

El " devuelve " sin embargo, la frase es:

  

verdadero si existe un índice; falso de lo contrario

... pero actualmente creo que un directorio vacío a veces (?) devolverá IndexReader (de la prueba de mi unidad). De todos modos, no confiaría en eso.

Si crea un indexReader.numDocs() en un directorio vacío, parece que todos sus métodos regresarán sin lanzar excepciones. Puede ir a Document, y esto devolverá 0, pero eso no prueba que no hay índice allí, solo que no hay IndexSearcher s. Dependiendo de sus requisitos, eso podría ser suficiente, por supuesto.

Del mismo modo, puede crear un IndexWriter a partir de dicho <=>, y puede crear un <=>. Ninguno de estos tendrá ningún problema aparente con un directorio vacío.

MEJOR SOLUCIÓN:

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

Esto parece, hasta donde puedo decir, ser confiable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top