2008-10-22 8 views

Respuesta

119

En general, existe una compensación entre "precisión" y "recuperación". La alta precisión significa que se presentan menos resultados irrelevantes (sin falsos positivos), mientras que la recuperación alta significa que faltan menos resultados relevantes (sin falsos negativos). El uso del operador LIKE le brinda una precisión del 100% sin concesiones para la recuperación. Un servicio de búsqueda de texto completo le brinda mucha flexibilidad para ajustar la precisión y recuperarla mejor.

La mayoría de las implementaciones de búsqueda de texto completo utilizan un "índice invertido". Este es un índice donde las claves son términos individuales, y los valores asociados son conjuntos de registros que contienen el término. La búsqueda de texto completo está optimizada para calcular la intersección, unión, etc. de estos conjuntos de registros, y generalmente proporciona un algoritmo de clasificación para cuantificar con qué fuerza coincide un registro determinado con las palabras clave de búsqueda.

El operador SQL LIKE puede ser extremadamente ineficiente. Si lo aplica a una columna no indexada, se usará un análisis completo para buscar coincidencias (como cualquier consulta en un campo no indexado). Si la columna está indexada, se puede realizar la comparación con las claves de índice, pero con mucha menos eficiencia que la mayoría de las búsquedas de índice. En el peor de los casos, el patrón LIKE tendrá comodines principales que requieren que se examine cada clave de índice. Por el contrario, muchos sistemas de recuperación de información pueden habilitar el soporte para comodines líderes mediante la compilación previa de árboles de sufijos en los campos seleccionados.

Otras características típicas de búsqueda de texto completo son

  • análisis léxico o tokenización — romper un bloque de texto no estructurado en palabras, frases, y fichas especiales individuales
  • morfológica de análisis, o derivación — variaciones colapsadas de una palabra dada en un término de índice; por ejemplo, el tratamiento de "ratones" y "ratón", o "electrificación" y "eléctrica", como la misma palabra
  • clasificación — la medición de la similitud de un registro coincidente a la cadena de consulta
+1

ranking se expliquen mejor en @ VipinJain's [ respuesta] (http://stackoverflow.com/a/35765302/212044) – ychaouche

32

FTS implica indexar las palabras individuales dentro de un campo de texto para acelerar la búsqueda a través de muchos registros. El uso de LIKE todavía requiere que realice una búsqueda de cadenas (lineal o similar) dentro del campo.

+2

Explicación muy concisa, gracias – Baconbeastnz

14

Me gusta solo usa comodines, y no es tan poderoso.

El texto completo permite una búsqueda mucho más compleja, incluyendo Y, O, No, incluso resultados de sonido similares (SOUNDEX) y muchos más elementos.

Comenzaría a buscar en SQL CONTAINS() FREETEXT() y en los artículos de búsqueda de texto completo para ayudarlo a comprender mejor lo que está disponible.

+4

'incluso resultados de sonido similares' me consiguieron! Aprendí algo nuevo hoy, gracias! :-) –

+1

Recomiendo encarecidamente que todos los usuarios que revisen [SOUNDEX] (https://docs.microsoft.com/en-us/sql/t-sql/functions/soundex-transact-sql) – sotn

9

La verdadera diferencia son las metodologías de escaneo. Para la búsqueda de texto completo, las palabras (términos) se utilizan como claves hash - cada uno de los cuales está asociado con una serie de documentos de las claves (términos) aparece en su siguiente manera:.

Document sets = {d1, d2, d3, d4, ... dn} 
Term sets = {t1, t2, t3, .. tn} 

Ahora término-documento matriz (que miembro de término de los cuales documento) se puede representar como:

t1 -> {d1, d5, d9,.. dn} 
t2 -> {d11, d50, d2,.. dn} 
t3 -> {d23, d67, d34,.. dn} 
: 
tn -> {d90, d87, d57,.. dn} 

Cuando entra la petición pidiendo "Tráeme todos los documentos que contienen la palabra t1/term" - entonces el conjunto de documentos se devuelve {d1, d5, d9,.. dn}.

Podría hackear un esquema de tabla desnormalizada para almacenar documentos: cada fila en la tabla MySQL se considerará como "documento" y una columna TEXTO podría contener un párrafo, etc. El índice invertido contendrá los términos como claves y los identificadores de filas como los identificadores del documento.

Recuerde que esta consulta SQL tendrá más o menos O (1) rendimiento. La consulta será independiente de

  1. Número de palabras/términos en la columna TEXT
  2. el número de filas/documentos que coincidan con los criterios
  3. la longitud de las palabras/términos

Para Por ejemplo, este SQL podría ser disparado para extraer todas las filas que coincidan con la palabra dada XYZ:

SELECT * 
FROM my_table 
WHERE MATCH (my_text_column) against ('XYZ' IN boolean mode) ; 

Advertencia: Si agregue ORDER BY a esta consulta, sus tiempos de ejecución variarán según los diversos parámetros, uno de los cuales es el número de filas/documentos coincidentes. Así que ten cuidado.

Sin embargo, The LIKE no tiene nada de esto. Se ve obligado a escanear linealmente la oración/cadena y encontrar todos los términos coincidentes. Agregar comodín se suma al desastre. Funciona muy bien para cadenas de pequeña longitud, como se puede imaginar, pero fracasará miserablemente en oraciones más largas. Y definitivamente no es comparable cuando tiene un párrafo o una página entera de texto, etc.

12

MySQL crea un índice a partir de las palabras de la columna de búsqueda de texto completo habilitada y realiza búsquedas en este índice. MySQL usa un algoritmo sofisticado para determinar las filas que coinciden con la consulta de búsqueda.

La búsqueda de texto completo ofrece algunas ventajas.

Indexación:

Algo así como:

donde foo LIKE% Bar '; No se puede aprovechar un índice. Tiene que ver cada fila y ver si coincide. Un índice de texto completo, sin embargo, puede. De hecho, los índices de texto completo pueden ofrecer mucha más flexibilidad en términos de la orden de palabras coincidentes, lo cerca que esas palabras están juntas, etc.

Stemming:

Una búsqueda de texto completo puede contener palabras.Si busca ejecutar, puede obtener resultados para "ejecutar" o "ejecutar". La mayoría de los motores de texto completo tienen diccionarios originales en una variedad de idiomas.

Resultados: tabuladas

Un índice de texto completo puede abarcar varias columnas. Por ejemplo, puede buscar "pastel de melocotón" y el índice puede incluir un título, palabras clave y un cuerpo. Los resultados que coinciden con el título se pueden ponderar más alto, como más relevantes, y se pueden ordenar para mostrarlos en la parte superior.

Desventajas:

Un índice de texto completo puede ser potencialmente enorme, mucho más grande que un índice estándar B-árbol. Por esta razón, muchos proveedores alojados que ofrecen instancias de bases de datos deshabilitan esta característica, o al menos cobran extra por ella. Por ejemplo, la última vez que revisé, Windows Azure no admitía consultas de texto completo.

Los índices de texto completo también pueden ser más lentos de actualizar. Si los datos cambian un lote , puede haber algunos índices de actualización de retraso en comparación con los índices estándar.

Cuestiones relacionadas