Pregunta

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.

¿Fue útil?

Solución

En general, hay una compensación entre " precisión " y " recordar " ;. Alta precisión significa que se presentan menos resultados irrelevantes (sin falsos positivos), mientras que alta recordación significa que faltan menos resultados relevantes (sin falsos negativos). El uso del operador LIKE le da una precisión del 100% sin concesiones para el retiro. Un servicio de búsqueda de texto completo le ofrece mucha flexibilidad para reducir la precisión y poder recuperarlo mejor.

La mayoría de las implementaciones de búsqueda de texto completo usan 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 qué tan bien un registro dado 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 iniciales que requieren que se examinen todas las claves de índice. En contraste, muchos sistemas de recuperación de información pueden habilitar la compatibilidad con los caracteres comodín iniciales al compilar previamente los árboles de sufijos en los campos seleccionados.

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

  • análisis léxico o tokenización & # 8212; rompiendo un bloque de texto no estructurado en palabras individuales, frases y tokens especiales
  • morfológico Análisis, o derivando & # 8212; 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
  • ranking & # 8212; midiendo el similitud de un registro coincidente a la cadena de consulta

Otros consejos

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. El uso de LIKE aún requiere que realice una búsqueda de cadena (lineal o similar) dentro del campo.

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.

También, desde esta respuesta SO :

  

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

     

Indizació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 de esas palabras, etc.

     

Stemming :

     

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

     

Resultados ponderados:

     

Un índice de texto completo puede abarcar varias columnas. Por ejemplo, puede buscar " peach pie " ;, y el índice puede incluir un título, palabras clave y un cuerpo. Los resultados que coinciden con el título pueden ponderarse más alto, según sea más relevante, y pueden ordenarse para mostrarse en la parte superior.

     

Desventajas:

     

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

     

Los índices de texto completo también pueden ser más lentos de actualizar. Si los datos cambian mucho, es posible que haya algunos índices de actualización retrasados ??en comparación con los índices estándar.

Me gusta usa solo 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 ver los elementos de búsqueda de texto completo CONECTOS () FREETEXT () y relacionados para ayudar a comprender mejor qué hay disponible.

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 teclas (términos). Es como esto:

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

Ahora, la matriz de documento de término (cuyo término miembro 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, se solicita " Obtenme todos los documentos que contengan la palabra / término t1 " - luego se devuelve el conjunto de documentos {d1, d5, d9, .. dn }.

Podría piratear un esquema de tabla des-normalizado para almacenar documentos: cada fila en la tabla MySQL se considerará como " documento " y una columna de TEXTO puede contener un párrafo, etc. El índice invertido contendrá los términos como claves hash y los identificadores de fila como identificadores de 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 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 según los diversos parámetros, uno de los cuales es el número de filas / documentos coincidentes. Así que ten cuidado.

Sin embargo, el LIKE no tiene nada de esto. Se obliga a escanear linealmente la oración / cadena y encontrar todos los términos coincidentes. Agregar comodín agrega 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 al tener un párrafo o una página completa de texto, etc.

FTS es más eficiente y potente (especialmente para los separadores de palabras y las funciones de derivación)  ... pero verifique sus requisitos porque a veces los DB no admiten todos los idiomas, por ejemplo, MSSQL no es compatible con el griego (consulte en esta página http://msdn.microsoft.com/en-us/library/ms176076 (v = sql.110) .aspx )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top