2011-12-20 18 views
13

Actualmente estoy indexando una página web usando lucene. El objetivo es poder extraer rápidamente qué página contiene una determinada expresión (generalmente 1, 2 o 3 palabras) y qué otras palabras (o grupo de 1 a 3 de ellas) también están en la página. Esto se usará para construir/enriquecer/alterar un diccionario de sinónimos (vocabulario fijo).¿Cuál es la diferencia entre una consulta de frase y el uso de un filtro de tabla?

De los artículos que encontré, parece que el problema es encontrar n-grams (o tejas).

Lucene tiene un ShingleFilter, un ShingleMatrixFilter y un , que parecen estar relacionados con esta tarea.

De este presentation, aprendí que Lucene también puede buscar términos separados por un número fijo de palabras (llamadas slops). Se proporciona un ejemplo here.

Sin embargo, no entiendo claramente la diferencia entre esos enfoques? ¿Son fundamentalmente diferentes, o es una elección de tamaño de rendimiento/índice que tienes que hacer?

¿Cuál es la diferencia entre ShingleMatrixFilter y ShingleFilter?

¡Espero que un gurú de Lucene ENCUENTRA esta pregunta y responda ;-)!

Respuesta

17

Las diferencias entre el uso de la frase frente a la teja principalmente implican el rendimiento y la puntuación.

Cuando se utiliza la frase consultas (decir "foo bar") en el caso típico donde las palabras individuales están en el índice, frase consultas tienen que caminar el índice invertido para "foo" y para la "barra" y encontrar los documentos que contienen ambos términos, luego recorra sus listas de posiciones dentro de cada uno de esos documentos para encontrar los lugares donde "foo" apareció justo antes de "bar".

Esto tiene algún costo para el rendimiento y la puntuación:

  1. Posiciones (.prx) deben indexar y buscar, esto es como una "dimensión" adicional al índice invertido lo que aumentará de indexación y búsqueda veces
  2. Debido a que solo aparecen términos individuales en el índice invertido, no se calcula una "IDF de frase" real (esto podría no afectarlo). Por lo tanto, esto se aproxima en función de la suma del término IDF.

Por otro lado, si se utiliza el herpes zóster, también está indexando palabra n-gramas, en otras palabras, si usted está Shingling hasta la talla 2, también tendrá que términos como "foo bar" en el índice. Esto significa que para esta consulta de frase, se analizará como un TermQuery simple, sin usar ninguna lista de posiciones. Y dado que ahora es un "término real", la frase IDF será exacta, porque sabemos exactamente cuántos documentos existe este "término".

Pero el uso de tejas tiene algunos costos así:

  1. diccionario Mayor plazo, índice de términos y lista de publicaciones tamaños, aunque esto podría ser un intercambio justo, especialmente si usted deshabilitar completamente las posiciones totalmente con Field.setIndexOptions.
  2. Algunos costos adicionales durante la fase de análisis de indexación: aunque ShingleFilter está optimizado muy bien y es bastante rápido.
  3. No hay forma obvia de calcular "consultas de frase descuidadas" o coincidencias de frase inexactas, aunque esto se puede aproximar, p.para una frase de "foo bar baz" con culebrilla de tamaño 2, tendrá dos tokens: foo_bar, bar_baz y podría implementar la búsqueda a través de otras consultas de lucene (como BooleanQuery) para una aproximación inexacta.

En general, la indexación de palabras-N-gramas con cosas como culebrilla o CommonGrams es simplemente un compromiso (bastante experto), para reducir el costo de las consultas de posición o para mejorar la frase de puntuación.

Sin embargo, hay casos de uso del mundo real para estas cosas, un buen ejemplo está disponible aquí: http://www.hathitrust.org/blogs/large-scale-search/slow-queries-and-common-words-part-2

+0

Gracias por esta respuesta detallada (aceptado). ¿Podría comentar sobre la diferencia entre ShingleFilter y ShingleMatrixFilter? – blackbox

+0

Una buena explicación de hecho. Este artículo me ayudó a entender el herpes zóster con algunos ejemplos prácticos: https://www.elastic.co/blog/searching-with-shingles – krinker

Cuestiones relacionadas