Índice de datos en Lucene distribuido
Note
Esta característica también está disponible en NCache Professional.
Distributed Lucene permite una búsqueda eficiente al indexar los documentos, donde los índices deben crearse y almacenarse en un directorio. El primer paso es inicializar el directorio que almacena los índices. A diferencia de Lucene.NET, NCacheDirectory
se utiliza para abrir un directorio especificando el nombre de caché y el nombre de índice.
Note
La ruta predeterminada para el directorio de índice es C: \ ProgramData \ncache\lucene-index\{CACHE_NAME}\datos para Windows, y /usuario/compartir/ncache/lucene-index/{CACHE_NAME}/datos para Linux.
Una vez inicializado el directorio, IndexWriter
se abre proporcionando la instancia de NCacheDirectory
y del Configuración de IndexWriter. IndexWriter
agrega e indexa los documentos en el índice con el mismo mecanismo que en Lucene.NET usando el AddDocument
método.
Note
Para la distribución de documentos entre los servidores de caché, NCache agrega automáticamente un TextField
con un DocKey
y un valor GUID generado automáticamente a un documento si el usuario no lo especifica.
Todas las operaciones de escritura realizadas en los índices son sincrónicas. Por lo tanto, sólo se devuelven al usuario al finalizar dichas operaciones. Esto agrega coherencia e integridad de los datos a Distributed Lucene.
Importante:
Para cualquier operación de escritura en el escritor, necesitamos llamar al Commit
para guardarlo en el directorio de documentos. Es necesario llamar a la confirmación; de lo contrario, no guardará las operaciones de escritura y también puede afectar las operaciones de búsqueda en los documentos agregados.
A diferencia de Lucene.NET, puede abrir varios escritores en el mismo directorio para la indexación paralela. Cuando el documento está escrito, IndexWriter.Commit
se llama para persistir el documento y hacer que se pueda buscar. Una vez el IndexWriter
se utiliza para indexar los datos, IndexWriter.Dispose
necesita ser llamado para liberar los recursos en uso.
Consejo
Puede obtener información sobre la finalización de las operaciones de escritura en una instancia utilizando el NCache previsto Boolean
perfecta IndexWriter.OperationsCompleted
.
Requisitos previos
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache características del lado del cliente, consulte la página proporcionada en Requisitos previos de la API del lado del cliente.
- Asegúrese de haber creado e iniciado un caché de Lucene a través del NCache Centro de gestion or Interfaz de línea de comandos.
- Asegurar que Notificaciones de clientes están habilitados
- Asegúrese de que su aplicación no utilice ninguna DLL/referencia nativa de Lucene.
- Para obtener detalles de la API, consulte: NCacheDirectorio, Analizador, Analizador de espacio blanco, Escritor de índices, Configuración de IndexWriter, COMPROMÉTASE, AñadirDocumento, Documento.
Datos de indexación
El siguiente ejemplo abre primero el NCacheDirectory
especificando el nombre de caché como lucenecaché y el nombre del índice como Índice de productos. Luego abre un IndexWriter
en el directorio especificado especificando el Analizador de espacios en blanco para analizar los datos.
advertencia
Las operaciones de escritura de índice no están permitidas en caso de grupo parcial.
// Specify the Distributed-Lucene cache name
string cache = "LuceneCache";
// Specify the index name to create the indexes
string indexName = "ProductIndex";
NCacheDirectory ncacheDirectory = null;
IndexWriter indexWriter = null;
//Initializing
// Create a directory and open it on the cache and the index path
ncacheDirectory = NCacheDirectory.Open(cache, indexName);
// Specify the analyzer used to analyze data
Analyzer analyzer = new WhitespaceAnalyzer(LuceneVersion.LUCENE_48);
// Create an indexWriterConfig which holds all the configurations to create an instance of the writer
IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.
LUCENE_48, analyzer);
// Create an instance of the writer
indexWriter = new IndexWriter(ncacheDirectory, new IndexWriterConfig
(LuceneVersion.LUCENE_48, _analyzer));
// Indexing
// Add the products information that is to be indexed
Product[] products = FetchProductsFromDB();
foreach (var prod in products)
{
// Create a document and add fields to it
Document doc = new Document();
doc.Add(new TextField("ProductID", prod.ProductID.ToString(),
Field.Store.YES));
doc.Add(new TextField("ProductName", prod.ProductName, Field.Store.NO));
doc.Add(new TextField("Category", prod.Category, Field.Store.YES));
doc.Add(new TextField("Description", prod.Description, Field.Store.YES));
// Writer is created previously
indexWriter.AddDocument(doc);
}
// Calling commit on the writer saves all the write operations
indexWriter.Commit();
if(indexWriter.OperationsCompleted)
{
// All writing operations are complete
// Can proceed with other operations such as querying
}
// Dispose the indexWriter after indexing
if (indexWriter != null) indexWriter.Dispose();
// Dispose the ncacheDirectory
if (ncacheDirectory != null) ncacheDirectory.Dispose();
Note
Deberías llamar Dispose
al final de cada writer
Por ejemplo, de lo contrario, vive en la memoria y provoca pérdidas de memoria.
Recursos adicionales
NCache proporciona una aplicación de muestra para Distributed Lucene en GitHub.
Vea también
.NETO: Lucene.Net.Índice espacio de nombres