indexing full-text-search lucene.net search full-text-indexing

indexing - ¿Cómo identificar si existe un índice Lucene.Net en una carpeta?



full-text-search search (6)

¡Ups!

Este es el Lucene "Java directo", pero bien 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 DirectoryReader.indexExists() 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 un índice está en proceso de confirmación

... sí, se rompe a mitad de la oración. NB He compilado mi Javadoc directamente desde la fuente, pero la misma frase inacabada se puede ver en la API en línea. No solo eso, sino que miré la API de Lucene 6.0.0, y es exactamente lo mismo.

La frase "devoluciones" es sin embargo:

verdadero si existe un índice; falso de lo contrario

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

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

De forma similar, puede crear un IndexSearcher partir de dicho IndexReader y puede crear un IndexWriter . 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, por lo que puedo decir, ser confiable.

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

IndexWriter writer = new IndexWriter(@"C:/index", new StandardAnalyzer(), !IndexExists); ... private bool IndexExists { get { return ?? } }

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


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


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

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


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

private bool IndexExists {get {return IndexDirectory.FileExists ("segments.gen"); }}


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 (lo mismo 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)