2009-08-16 8 views
5

Tengo dos índices separados que contienen campos diferentes que, en conjunto, contienen todos los campos de búsqueda para un índice. Por ejemplo, el primer índice contiene el texto indexado para todos los documentos, y el segundo contiene etiquetas para todos y cada uno de los documentos.Cómo combinar coincidencias de dos índices de Lucene distintos (no fragmentados)

Tenga en cuenta que el siguiente ejemplo es un poco inestable ya que he cambiado los nombres de las entidades. Índice1: texto Documento de identidad

índice 2: tag-name: "muy importante" usuario: "Identificación de Fred"

Me gustaría mantener los índices separados, ya que parece un desperdicio de actualizar continuamente un solo índice cada vez que un usuario agrega/elimina una etiqueta.

Hasta ahora, creo que podría necesitar procesar los dos resultados de búsqueda y fusionarlos manualmente (en código). ¿Alguna otra sugerencia?

No deseo fusionar índices separados/fragmentados.

+0

¿Hay alguna razón por la que necesite las etiquetas almacenadas en el índice? ¿Por qué no almacenar esta información en una base de datos relacional (como MySQL o SQL Server) y almacenar la identificación única en el índice? – jeremyalan

+0

@Phoenix - Porque quiero poder ejecutar una consulta que abarque ambos índices. –

Respuesta

4

Lucene tiene un tipo de IndexReader para admitir esta disposición — ParallelReader.

Puede ser un poco complicado de usar, ya que el identificador de documento Lucene para un registro debe ser el mismo en ambos índices. En la práctica, esto significa agregar documentos en el mismo orden a ambos índices. He leído que, en algunos casos, la eliminación de documentos y la optimización de índices pueden hacer que Lucene reasigne estos identificadores de documento, pero no he experimentado para saber si esto es cierto. Se puede necesitar cuidado adicional si se modifican los registros existentes. Si solo se anexan nuevos registros, no debería haber problemas.

Este enfoque se denomina generalmente "partición vertical", en oposición a "partición horizontal" o fragmentación.

+0

Esto parece incorrecto al tener que esperar que las identificaciones de documentos coincidan en ambos casos. Me gustaría gestionar esto correctamente. –

+0

Es más que una simple esperanza de que los ID de documento coincidan a medida que se agregan los documentos al índice; Los ID son simplemente un número de secuencia. Lo que no tengo claro es si Lucene volverá a asignar identificaciones de documentos para "compactar" un índice que tenga una alta proporción de registros eliminados (recordando que una "actualización" en Lucene es una eliminación del registro original seguido de un agregado del "actualizado" "grabar") – erickson

+0

"número de secuencia" está más cerca de la definición verdadera que "identificación de documento", pero realmente son solo un "desplazamiento". A medida que se optimiza un índice y los documentos eliminados se eliminan físicamente de los archivos de índice subyacentes (algo así como des-fragmentando el índice), estos desplazamientos cambiarán, y no hay manera (fácil) de detectarlo. La solución más común a este problema que he encontrado es almacenar su propia identificación única en un campo "id" en su documento Lucene. – jeremyalan

0

Parece que necesita unir los índices en el código. Si entiendo correctamente, al buscar un término, puede haber coincidencias con el texto del documento o con las etiquetas, y cada etiqueta está indexada con sus identificadores de documentos relevantes. A continuación, tendrá dos listas de éxitos para fusionar. Como las etiquetas y el texto completo son entidades muy diferentes, necesitará cierta ponderación (tal vez como aumentos de campo durante la recuperación) para alcanzar una buena clasificación. Por lo tanto, se puede combinar la etiqueta golpeó y golpeó texto completo del documento k utilizando una fórmula como:

score(k) = a*tagscore(k)+b*fulltextscore(k)

donde A y B será coeficientes determinados empíricamente.

Para una discusión mucho más detallada, vea los documentos findability y debugging relevance issues in search de Grant Ingersoll.

+0

La puntuación no es un problema, ya que las fusiones se realizarán en límites de consulta booleanos. La pregunta real permanece en términos de cómo hacer la búsqueda. –

+0

@mP: aclare. Si almacena una identificación única por documento en ambos índices, no veo ningún problema en la búsqueda. Veo un problema de clasificación/puntuación: si obtiene 1000 visitas del texto del documento y 2000 visitas de etiquetas, probablemente desee mostrar las 20 principales más o menos; Aquí es donde importa marcar. –

0

El principal problema con este enfoque tiene que ver con la clasificación de documentos porque el algoritmo predeterminado (y probablemente la mayoría de los algoritmos personalizados, con algunas excepciones) se basan en la frecuencia de los términos y la frecuencia inversa del documento.

En otras palabras, el Anotador necesita saber cuántas veces aparece un término dentro de un documento, así como cuántos otros documentos contienen el término. Esta información se almacena para cada término en el índice, pero no para el agregado en múltiples índices.

La solución común a este problema es un enfoque de dos fases. Primero, la consulta se ejecuta contra cada índice para determinar cuántos documentos contienen cada término.A continuación, los resultados se agregan y la consulta se ejecuta nuevamente, pero esta vez la frecuencia del documento inverso se envía junto con ella.

Como se puede imaginar, esto no funcionará tan bien como ejecutar una consulta contra un solo índice, pero como nada es gratuito, supongo que es la compensación para almacenar documentos en varios índices.

Cuestiones relacionadas