sql >> Base de Datos >  >> RDS >> Mysql

Búsquedas de texto completo en MySQL:lo bueno, lo malo y lo feo

A veces, al buscar en una base de datos MySQL, es posible que desee ejecutar consultas de búsqueda de texto completo en datos basados ​​en caracteres. Hoy estamos discutiendo las ventajas y desventajas de tales métodos de búsqueda.

¿Qué son las búsquedas de texto completo en MySQL?

La búsqueda de texto completo es una técnica que le permite buscar registros que podrían no coincidir perfectamente con los criterios de búsqueda. Las búsquedas de texto completo en MySQL se realizan cuando ciertos índices están en uso y esos índices tienen muchos matices únicos, incluidos los siguientes:

  • Para que el índice se considere un índice de texto completo, el índice debe ser del tipo FULLTEXT.
  • Los índices FULLTEXT solo se pueden usar en tablas que ejecutan los motores de almacenamiento InnoDB o MyISAM.
  • Los índices FULLTEXT solo se pueden crear para las columnas CHAR, VARCHAR o TEXT.
  • Los índices FULLTEXT solo se usan cuando se usa la cláusula MATCH() AGAINST().
  • Las búsquedas de texto completo tienen tres modos:el modo de lenguaje natural, el modo booleano y el modo de expansión de consultas.

Un índice FULLTEXT es un tipo especial de índice que encuentra palabras clave en el texto en lugar de comparar los valores con los valores del índice. Aunque la búsqueda de TEXTO COMPLETO es diferente de otros tipos de concordancia, tenga en cuenta que puede tener un índice BTREE y un índice de TEXTO COMPLETO en la misma columna al mismo tiempo; no entrarán en conflicto porque son adecuados para diferentes propósitos.

Tipos de búsqueda de texto completo

Al ejecutar búsquedas de texto completo en MySQL, tenga en cuenta que hay tres tipos de búsqueda para elegir:

  1. Un tipo de búsqueda de lenguaje natural:este modo de búsqueda interpreta la cadena de búsqueda como una frase literal. Habilitado de forma predeterminada si no se especifica ningún modificador o cuando se especifica el modificador EN MODO DE LENGUAJE NATURAL;
  2. Un tipo de búsqueda de expansión de consulta:dicho modo de búsqueda realiza la búsqueda dos veces. Al buscar por segunda vez, el conjunto de resultados incluye algunos de los documentos más relevantes de la primera búsqueda. Habilitado usando el modificador CON EXPANSIÓN DE CONSULTA;
  3. Un tipo de búsqueda booleana:este modo de búsqueda permite buscar consultas complejas que pueden incluir operadores booleanos como menos que ("<") y más que (">"), subexpresiones ("( ” y “)”), el signo más (+), el signo menos (-), las comillas dobles (“”), un operador que reduce la contribución del valor a los resultados (~) y el operador comodín (*) - el El operador comodín permite buscar con coincidencia aproximada (por ejemplo, "demostración*" también coincidiría con "demostración"). Habilitado usando el modificador IN BOOLEAN MODE.

Búsquedas de texto completo con el modo de búsqueda de lenguaje natural

Un modo de búsqueda de lenguaje natural, como se indicó anteriormente, está habilitado de forma predeterminada o cuando se especifica el modificador EN MODO DE LENGUAJE NATURAL. Este modo realiza una búsqueda en lenguaje natural en una colección de texto dada (una o más columnas). El formato de consulta básico de las búsquedas de texto completo en MySQL debe ser similar al siguiente:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

Cuando MATCH() se usa junto con una cláusula WHERE, las filas se ordenan automáticamente por la relevancia más alta primero. Para buscar una cadena exacta, escríbala entre comillas dobles.

Búsquedas de texto completo con el modo de expansión de consultas

Las búsquedas de texto completo también admiten el modo de expansión de consultas. Este modo de búsqueda se usa con frecuencia cuando el usuario confía en el conocimiento implícito; por ejemplo, el usuario puede buscar "DBMS" con la esperanza de ver tanto "MongoDB" como "MySQL" en los resultados de la búsqueda. La razón por la que el usuario podría confiar en algún conocimiento implícito al usar dicho modo de búsqueda es bastante simple:una búsqueda de texto completo con el modo de expansión de consulta funciona realizando la búsqueda dos veces:la segunda frase de búsqueda es la primera frase de búsqueda concatenado con algunas de las entradas más relevantes de la primera búsqueda. Eso quiere decir que, por ejemplo, si en la primera búsqueda una de las filas contendría la palabra “DBMS” y la palabra “MySQL”, la segunda búsqueda encontraría las entradas que incluirían la palabra “MySQL” aunque no las tengan. contienen "DBMS". El formato de consulta que usaría el modo de expansión de consulta sería así:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 

Búsquedas de texto completo utilizando el modo booleano

El modo booleano es quizás una de las cosas más interesantes que ofrece la búsqueda de texto completo de MySQL. Este modo tiene muchas advertencias únicas porque le permite expandir las capacidades de búsqueda usando operadores booleanos. Cuando se usa el modo booleano, ciertos caracteres pueden tener un significado especial al principio o al final de las palabras. Por ejemplo:

  • “+” significa Y;
  • “-” significa NO;
  • Los operadores “(“ y “)” permiten crear subexpresiones;
  • Los operadores
  • “<” y “>” cambian el rango del valor de búsqueda hacia abajo o hacia arriba;
  • “~” reduce la contribución del valor a los resultados de búsqueda;
  • Las comillas dobles ("") solo coinciden con valores literales;
  • “*” es un operador comodín (consulte la explicación anterior).

Estos operadores le permiten ampliar la funcionalidad de la búsqueda:por ejemplo, si desea recuperar todas las filas que contienen la palabra "Demo", pero no "Demo2", puede usar una consulta así:

SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

También puede usar comillas dobles junto con comillas simples como esta:

SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

Problemas de búsqueda de texto completo

Antes de usar la búsqueda de texto completo en MySQL, tenga en cuenta que la búsqueda tiene algunos "errores":

  • Tanto los motores de almacenamiento InnoDB como MyISAM tienen sus propias listas de palabras vacías. La lista de palabras vacías de InnoDB se puede encontrar aquí, la lista de palabras vacías de MyISAM se puede encontrar aquí.
    • Para definir su propia lista de palabras vacías para InnoDB, defina una tabla con la misma estructura que la tabla INNODB_FT_DEFAULT_STOPWORD, inserte palabras vacías allí, luego establezca el valor de la opción innodb_ft_server_stopword_table en forma de db_name/table_name.
    • Para definir su propia lista de palabras vacías para MyISAM, establezca la variable ft_stopword_file en el nombre de ruta del archivo que contiene la lista de palabras vacías. En el archivo, las palabras vacías se pueden separar con cualquier carácter no alfanumérico, excepto "_" y "'". El archivo de palabras vacías predeterminado se encuentra en storage/myisam/ft_static.c. Las palabras vacías se pueden deshabilitar configurando la variable en una cadena vacía.
  • Las búsquedas de texto completo no se admiten en tablas particionadas.
  • Todas las columnas en un índice FULLTEXT deben usar el mismo conjunto de caracteres y colación.
  • Las operaciones de búsqueda de texto completo no tratan la cadena % como un comodín.

Aquí hay otra trampa:es posible que también desee tener en cuenta que el analizador de TEXTO COMPLETO incorporado determina dónde comienzan y terminan las palabras mirando ciertos caracteres, incluidos el espacio (" "), la coma (", ”) y punto (“.”), lo que significa que si su cadena de búsqueda contiene uno o más de esos caracteres, es posible que los resultados de la búsqueda no sean precisos. Por ejemplo, si su base de datos contiene 5 filas con la cadena "test.demo", la consulta de búsqueda "test.demo" podría arrojar más resultados (10, 15, etc.), incluidos "demo", "string.demo_example", etc. porque va a buscar "demo" en lugar de "test.demo", por lo que es posible que se quede con muchas coincidencias irrelevantes. MySQL ofrece una solución para este problema si está dispuesto a escribir su propio complemento en C o C++ (consulte la documentación de MySQL), pero hasta entonces, no puede hacer mucho.

La lista completa de restricciones de texto completo de MySQL se puede ver en la página de documentación de MySQL.

Resumen

La capacidad de búsqueda de texto completo de MySQL proporciona una forma sencilla de implementar varias técnicas de búsqueda (búsqueda en lenguaje natural, búsqueda de expansión de consulta y búsqueda booleana) en su aplicación que ejecuta MySQL. Cada una de esas técnicas de búsqueda tiene sus propias advertencias y cada una de ellas puede ser adecuada para diferentes propósitos:cuando decida si usar la búsqueda de texto completo, tenga en cuenta que este tipo de búsqueda tiene muchas sutilezas únicas, conozca los beneficios y desventajas de utilizar la búsqueda de texto completo en MySQL y elegir sabiamente.