Descripción general de Lucene distribuido
Note
Esta función está disponible en NCache Empresa y Profesional para Topologías con particiones solamente.
NCache proporciona una Lucene módulo, que le permite utilizar Lucene para la búsqueda de texto con NCache. Cada servidor de NCache tiene un módulo Lucene dedicado. Esto hace que Lucene sea distribuido, escalable y altamente disponible con NCache.
Note
NCache utiliza la versión 4.8 de Lucene.Net.
Por qué usar Lucene con NCache?
Lucene, como sabemos, es un motor de búsqueda potente y eficiente que proporciona una amplia gama de técnicas de búsqueda de texto para satisfacer las necesidades de su negocio. Lucene es mucho más que cualquier otro motor de búsqueda de texto, ya que las opciones que se le ofrecen al usuario son múltiples. Tiene potentes algoritmos de búsqueda y admite una amplia gama de consultas de búsqueda.
Aunque tan poderoso como Lucene es por sí solo, tiene sus limitaciones. Lucene se ejecuta en proceso en la aplicación cliente. Esto significa que Lucene no es escalable y tiene un único punto de falla.
NCache proporciona una implementación distribuida de Lucene con cambios menores en su API. Llamadas a la API de Lucene NCache en el backend. NCache ser distribuido en la naturaleza con Lucene proporciona escalabilidad de escritura lineal ya que los documentos indexados por las aplicaciones se distribuyen automáticamente entre los nodos de caché donde se indexan por separado.
Note
Distributed Lucene utiliza una tienda Lucene separada y dedicada en lugar de la NCache almacén de caché.
De manera similar, Distributed Lucene también proporciona escalabilidad de lectura lineal ya que las consultas se propagan en cada partición y los resultados se combinan. Una mayor cantidad de particiones proporciona una mayor cantidad de escalabilidad de lectura y escritura. Los índices de Lucene persisten en su disco físico. Cuantos más nodos, mayor será la escalabilidad, el rendimiento y la capacidad de almacenamiento para acomodar una gran cantidad de documentos y datos indexados de Lucene.
Funcionamiento de Distributed Lucene
Importante:
Se recomienda encarecidamente utilizar un SSD para indexar y buscar documentos de Lucene en lugar de un HDD.
El comportamiento y funcionamiento de Lucene y Distributed Lucene son casi los mismos con algunos cambios. El flujo de trabajo, la distribución de datos y los componentes de Distributed Lucene se explican en las siguientes secciones:
Flujo de trabajo distribuido de Lucene
El siguiente diagrama muestra cómo funciona el modelo distribuido de Lucene.
Es posible que la aplicación cliente desee indexar y analizar (analizados mediante analizadores de Lucene compatibles) documentos o consultar documentos indexados existentes mediante la API de Lucene. Estas operaciones con la API actúan como llamadas a procedimientos remotos (RPC) y se reenvían directamente al NCache grupo. El clúster determina la naturaleza de estas llamadas y las reenvía a los módulos distribuidos de Lucene conectados a cada nodo del servidor. Estos módulos ejecutan estas llamadas y, según la naturaleza de las llamadas, se lleva a cabo cualquiera de las siguientes acciones:
Consulta Documento Convocatoria: En caso de que se trate de una llamada de consulta, los módulos distribuidos de Lucene devuelven resultados al lado del cliente, donde todos estos resultados se fusionan y procesan.
Índice Documento Convocatoria: En caso de que se trate de una llamada para indexar un documento, los módulos distribuidos de Lucene conservan ese documento en una unidad de disco.
Distribución de datos
Se genera un mapa de distribución contra un clúster de caché. Para Distributed Lucene, se genera este mapa:
- En la creación de caché.
- Sobre la adición o eliminación de un nodo de servidor.
advertencia
En caso de que el mapa de distribución no exista, la caché no se inicia y las excepciones se registran en el visor de eventos y en los registros de servicio.
Este mapa contiene información sobre los cubos contra los nodos de caché. El número total de depósitos para una caché de Lucene distribuida es 100. Estos 100 depósitos se distribuyen en el clúster mediante una estrategia específica.
Tener 100 depósitos significa que un índice se divide en 100 subíndices en todo el clúster de caché. Según la cantidad de depósitos asignados a cada nodo, todos los archivos de índice respectivos también se mueven a ese nodo en particular. Por lo tanto, cada vez que la transferencia de estado provoca el movimiento de depósitos a través del clúster de caché, los archivos de índice correspondientes también se mueven como parte del proceso.
Un nodo de servidor puede contener varios índices y cada índice dentro de ese nodo de servidor contiene depósitos que se le asignan de acuerdo con la estrategia de distribución del clúster. Los documentos comparados con los índices se distribuyen equitativamente a través de estos depósitos. Estos índices también persisten en su disco físico.
NCache tiene tiempo de ejecución o distribución dinámica. El inicio o la detención del nodo activará un cambio en el mapa de distribución del clúster de caché y activará la transferencia de estado. Sin embargo, en NCache Lucene distribuido, los índices se conservan en su disco físico para evitar la distribución innecesaria de índices al iniciar o detener el nodo. Es decir, que en NCache Lucene distribuido, solo la adición o eliminación de un nodo del clúster de caché cambiará el mapa de distribución y activará la transferencia de estado para los nodos del servidor en ejecución. Para los nodos de servidor detenidos, la transferencia de estado tendrá lugar una vez que vuelvan a estar en línea.
Los siguientes son algunos puntos importantes a considerar para NCache Lucene distribuido:
- Mapa de distribución de caché: El mapa de distribución de una nueva memoria caché solo se genera cuando la creación de la memoria caché se realiza correctamente. Si la generación del mapa de distribución falla por algún motivo, la creación de la memoria caché se retrotrae (revierte).
- Transferencia estatal: Cualquier cambio en la configuración de la membresía del clúster de caché provocará cambios en el mapa de distribución porque esto activará la transferencia de estado en el clúster de caché.
- Adición de nodos a un clúster existente: En este caso, todos los nodos del servidor (incluso el que se está agregando) deberían estar disponibles físicamente y su servicio debería estar ejecutándose. Cuando se agrega un nodo al clúster de caché Distributed Lucene, el mapa de distribución existente se obtiene de los nodos de servidor existentes. A continuación, se genera un nuevo mapa de distribución y se comparte con todos los nodos del servidor. Se envía una llamada de confirmación para conservar este mapa de distribución.
- Eliminación de nodos de un clúster existente: En este caso, de forma similar a la adición de nodos a un clúster existente, todos los nodos del servidor (excepto el que se está eliminando) deberían estar físicamente disponibles y su servicio debería estar ejecutándose. De lo contrario, esta operación fallará.
- Cierre del nodo durante la transferencia de estado: Si un nodo de servidor se apaga durante la transferencia de estado, la transferencia de estado para ese nodo se detiene y se reanuda desde el mismo depósito (donde el nodo se apaga) cuando el nodo se reinicia.
Importante:
En el caso de la instalación del desarrollador, las tiendas pueden configurar Distributed Lucene.
Inicializar Lucene distribuido
Antes de comenzar a utilizar Distributed Lucene para indexar sus documentos y buscarlos posteriormente, debe inicializar primero. Una vez que lo haya inicializado, deberá proporcionar el nombre de la caché y el nombre del índice.
Datos de índice
El proceso de indexación en Distributed Lucene es el mismo que el del propio Lucene. En el caso de Lucene distribuido, NCache mantiene un almacén clave-valor para la distribución de documentos y se agrega una clave generada automáticamente a cada documento. El documento se indexa en el nodo con esa clave específica.
Búsqueda de índice
Una vez que se haya inicializado Distributed Lucene y se hayan indexado sus documentos, puede realizar búsquedas basadas en texto en estos documentos.
Facetas
Una categoría es un aspecto esencial de un documento indexado que se utiliza para clasificarlo. Por ejemplo, al buscar ropa en una tienda de comercio electrónico, las categorías de la ropa pueden ser precio, material, marca, etc.
En la búsqueda por facetas, además de los resultados de búsqueda normales, también obtiene resultados por facetas, que constan de subcategorías para determinadas categorías. Siguiendo con el ejemplo anterior, las subcategorías de facetas de materiales pueden ser algodón, lana, cuero, etc.
La búsqueda facetada le facilita la búsqueda de documentos específicos que necesita. NCache ahora admite Facetas con Distributed Lucene, que lo ayudará con los documentos deseados de manera eficiente y efectiva. El funcionamiento de las facetas en Lucene y Distributed Lucene es prácticamente el mismo, pero con muchas mejoras de rendimiento que se destacan en Facetas de Lucene distribuidas.
API geoespacial
Los datos que contienen valores de coordenadas de longitud y latitud se denominan Datos geoespaciales. Estos datos son útiles si desea buscar datos según su ubicación. Por ejemplo, desea indexar un documento que contiene la información de un restaurante. Este documento contiene varios campos y uno de esos campos contiene los valores de longitud y latitud. Para buscar este documento en el futuro según su ubicación (digamos el restaurante más cercano a usted), también querrá indexar los campos de longitud y latitud.
Lucene tiene una función muy potente de indexación y búsqueda de datos geoespaciales, y ahora NCache También le permite indexar y luego buscar documentos con respecto a su ubicación con la API de Lucene. El siguiente enlace le ayudará a comprender cómo indexar datos y buscarlos. API geoespacial distribuida de Lucene .
Comportamiento de Lucene distribuido en un clúster parcial
Un clúster de caché se declara parcial cuando uno o más nodos dentro de él dejan de estar disponibles. Por lo tanto, la conectividad es limitada, lo que convierte al clúster de caché en un clúster parcial. El comportamiento de Distributed Lucene en un clúster parcial se explica a continuación:
Operaciones de lectura en un clúster parcial
NCache Distributed Lucene le permite recuperar (leer) datos de un clúster parcial estableciendo el valor de la AllowPartialResults
propiedad a TRUE
en IndexReader
instancia de clase. Por defecto, el valor de la AllowPartialResults
la bandera está configurada en FALSE
.
Estas operaciones de lectura devolverán datos parciales o incompletos. Sin embargo, en el caso de Topología de réplica de partición, el clúster de caché tolerará una falla de un solo nodo a través de su réplica y podrá recuperar datos completos. Pero, en caso de fallas de múltiples nodos, solo podrá recuperar datos parciales.
advertencia
Si intenta leer datos de un clúster parcial y ha establecido el valor de la AllowPartialResults
bandera a FALSE
, se lanzará una excepción.
Operaciones de escritura en un clúster parcial
Lucene distribuido no le permite realizar operaciones de escritura como agregar, actualizar y eliminar en un clúster parcial. Si intenta realizar estas operaciones en un clúster parcial, se generará una excepción.
API de Lucene no compatible
A continuación se muestra una lista de las API de Lucene que no son compatibles con Distributed Lucene.
DirectoryReader
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexCommit commit)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexWriter writer, bool applyAllDeletes)
IndexSearcher
public IndexSearcher(IndexReaderContext context, TaskScheduler executor)
public Document Document(int docID, ISet<string> fieldsToLoad)
public virtual Weight CreateNormalizedWeight(Query query)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort, bool doDocScores, bool doMaxScore)
IndexReader
public static DirectoryReader Open(Directory directory)
public static DirectoryReader Open(Directory directory, int termInfosIndexDivisor)
public static DirectoryReader Open(IndexWriter writer, bool applyAllDeletes)
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public IList<AtomicReaderContext> Leaves
NCacheDirectory
public override string[] ListAll()
public override long FileLength(string name)
public override void DeleteFile(string name)
public override string GetLockID()
public override IndexInput OpenInput(string name, IOContext context)
CompositeReader
public override sealed IndexReaderContext Context
Recursos adicionales
NCache proporciona una aplicación de muestra para Distributed Lucene en GitHub.
Vea también
Componentes y descripción general de Lucene
Configurar índices de consulta de Lucene
Búsqueda SQL en caché
Caché de búsqueda con LINQ