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)
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 de 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