¿Qué es la búsqueda de texto completo vs LIKE?

133

Acabo de leer una publicación que menciona "búsqueda de texto completo" en SQL.

Me preguntaba cuál es la diferencia entre FTS y LIKE. Leí un par de artículos, pero no pude encontrar nada que lo explicara bien.

Nathan W
fuente

Respuestas:

164

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 alta memoria 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. Una función de búsqueda de texto completo le brinda mucha flexibilidad para ajustar la precisión para una mejor recuperación.

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, por lo general, proporciona un algoritmo de clasificación para cuantificar la fuerza con la que un registro determinado coincide con las palabras clave de búsqueda.

El operador SQL LIKE puede ser extremadamente ineficiente. Si lo aplica a una columna no indexada, se utilizará un análisis completo para encontrar coincidencias (como cualquier consulta en un campo no indexado). Si la columna está indexada, la comparación se puede realizar 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 cada clave de índice sea examinada. Por el contrario, muchos sistemas de recuperación de información pueden habilitar la compatibilidad con los comodines principales mediante la compilación previa de árboles de sufijos en campos seleccionados.

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

  • Análisis léxico o tokenización: dividir un bloque de texto no estructurado en palabras individuales, frases y tokens especiales
  • análisis morfológico, o derivación: variaciones de colapso de una palabra dada en un término de índice; por ejemplo, tratar "ratones" y "ratón", o "electrificación" y "eléctrico" como la misma palabra
  • clasificación: mide la similitud de un registro coincidente con la cadena de consulta
erickson
fuente
2
el ranking se explica mejor en la respuesta de
ychaouche
39

FTS implica indexar las palabras individuales dentro de un campo de texto para que la búsqueda a través de muchos registros sea rápida. Usar LIKE aún requiere que haga una búsqueda de cadena (lineal o similar) dentro del campo.

Ignacio Vazquez-Abrams
fuente
23

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.

Además, de esta respuesta SO :

Hay algunas ventajas en la búsqueda de texto completo.

Indexación:

Algo como:

WHERE Foo LIKE '%Bar';

No se puede aprovechar un índice. Tiene que mirar 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 del orden de las palabras coincidentes, qué tan cerca están esas palabras, etc.

Tallo:

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

Resultados ponderados:

Un índice de texto completo puede abarcar múltiples columnas. Por ejemplo, puede buscar "pastel de durazno", 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 relevante, y se pueden ordenar para mostrar cerca de la parte superior.

Desventajas

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

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

Vipin Jain
fuente
16

Like solo usa comodines, y no es tan poderoso.

El texto completo permite búsquedas mucho más complejas, incluyendo And, Or, Not, resultados de sonido similares (SOUNDEX) y muchos más elementos.

Comenzaría a mirar SQL CONTAINS () FREETEXT () y elementos de búsqueda de texto completo relacionados para ayudar a comprender mejor lo que está disponible.

Mitchel Sellers
fuente
2
Recomiendo encarecidamente a todos que consulten SOUNDEX
sotn
11

La verdadera diferencia son las metodologías de escaneo. Para la búsqueda de texto completo, las palabras (términos) se usan como claves hash, cada una de las cuales está asociada con una serie de documentos en los que aparecen las claves (términos). Es así:

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

Ahora, la matriz de documento de término (qué miembro de término de qué 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 llega la solicitud de "Obtenerme todos los documentos que contengan la palabra / término t1", {d1, d5, d9,.. dnse devuelve el conjunto de documentos }.

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

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

  1. Número de palabras / términos en la columna TEXTO
  2. El número de filas / documentos que coinciden con los criterios.
  3. La longitud de las palabras / términos

Por ejemplo, este SQL podría activarse 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 agrega ORDER BY a esta consulta, sus tiempos de ejecución variarán en función de varios parámetros, uno de los cuales es el número de filas / documentos coincidentes. Así que ten cuidado.

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

Kingz
fuente