Índice de búsqueda de texto completo de MySQL

Descripción general

Escenarios para utilizar la indexación de texto completo:

  1. Por ejemplo, la consulta del campo json es demasiado lenta
  2. Los motores de búsqueda más avanzados como ES, Solr y Lucene tienen mayores costos de aprendizaje y uso, pero sus requisitos de volumen de negocios no han alcanzado este nivel.

El índice de texto completo relaciona rápidamente documentos creando un índice invertido. Esta característica se introdujo en MySQL 5.6+. El índice de texto completo trata letras, números y guiones bajos consecutivos como una sola palabra. Generalmente se utilizan espacios, comas y puntos para palabras separadas.

Introducción:

  • El índice de texto completo en MySQL es un índice de tipo FultLeXT
  • Los índices de texto completo solo se pueden usar para tablas InnoDB o MyISAM y solo se pueden crear para columnas CHAR, VARCHAR y TEXT.
  • MATCH (campo) CONTRA (palabra clave) debe estar junto con el campo cuando se crea. Por ejemplo, el nombre del campo utilizado por MATCH (ligero, peso, bebé) es consistente con el nombre del campo definido por el músculo índice de texto completo (ligero, peso, bebé). Si solo consulta un único campo, deberá crear un índice de texto completo por separado.
  • El índice de texto completo se basa en palabras. innodb_ft_min_token_size e innodb_ft_max_token_size se utilizan para establecer la longitud máxima y mínima de las palabras. Aquellas que estén fuera de este rango de longitud se ignorarán.
  • Se ignorarán las palabras vacías en palabras vacías.
  • MySQL 5.7.6 proporciona compatibilidad integrada con el analizador de texto completo ngram para chino, japonés y coreano (CJK), y un complemento de analizador de texto completo MeCab instalable para japonés.
  • Se puede proporcionar CREATE TABLEuna definición de índice FULLTEXT en la declaración al crear la tabla, o agregarla más tarde usando ALTER TABLE o CREATE INDEX.
  • Para conjuntos de datos grandes, cargar los datos en una tabla sin un índice FULLTEXT y luego crear el índice es mucho más rápido que cargar los datos en una tabla con un índice FULLTEXT existente.

tipo

Tres tipos de índices de texto completo

  • Lenguaje natural: IN NATURAL LANGUAGE MODE, MATCH AGAINSTrecuperado pasando una cadena específica
  • Texto completo booleano: IN BOOLEAN MODEadmite operadores, como +indicar inclusión, -indicar no incluir
  • Expansión de consulta: WITH QUERY EXPANSIONequivalente a una expansión en modo de lenguaje natural, realiza dos recuperaciones, la primera recuperación utilizando una frase determinada y la segunda recuperación basada en la primera fila con mayor correlación.

crear

Tres formas de crear un índice de texto completo

  1. Especificar al crear la tablaFULLTEXT(column1, column2, ...)
  2. Modificar tabla:ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1, column2, ...);
  3. Agregue un índice a la tabla:CREATE FULLTEXT INDEX index_name ON table_name (column1, column2, ...);

Configuración
Edite my.iniel archivo de configuración y agregue:

# MySQL全文索引查询关键词最小长度限制
[mysqld]
ft_min_word_len = 1

Método de almacenamiento

  • full inverted index: ocupará más espacio porque no solo almacena la palabra y el ID del documento donde se encuentra la palabra, sino que también almacena la posición específica en el ID del documento donde se encuentra la palabra.
  • inverted file index: Sólo se almacena la palabra y el documento donde se encuentra la palabra correspondiente. Ahorre espacio, pero al buscar, solo puede obtener el documento correspondiente según las palabras clave y luego buscar

palabra de parada

InnoDB dividirá las palabras para el almacenamiento y, al realizar la búsqueda, se compararán según las palabras (el valor predeterminado son los símbolos en inglés). Algunas palabras no se pueden indexar ni consultar, por lo que se denominan palabras vacías. Consulta las palabras vacías predeterminadas del sistema:

SELECT * FROM information_schema.INNODB_FT_DEFAULT_STOPWORD;

Agregue palabras vacías personalizadas:

Tablas relacionadas

information_schema.INNODB_FT_INDEX_TABLE

information_schema.INNODB_FT_INDEX_CACHE
information_schema.INNODB_FT_DEFAULT_STOPWORD

Correlación

Principio de cálculo:

  • Si la palabra (palabra clave de consulta) aparece en el documento
  • El número de veces que aparece la palabra en el documento.
  • El número de palabras en la columna de índice.
  • ¿Cuántos documentos contienen esta palabra?

Clasificación: MySQL calcula la clasificación en función de la cantidad de palabras en la fila, la cantidad de palabras únicas, la cantidad total de palabras en todo el índice y la cantidad de filas que contienen la palabra.

combate real

Declaración de creación de tabla:

CREATE TABLE full_text_test (
    title VARCHAR(80),
    FULLTEXT (title)
);

Insertar datos preparados:

INSERT INTO full_text_test
VALUES
('It''s a beautiful night we''re looking for something dumb to do'),
('Hey baby I think I wanna marry you'),
('Is it the look in your eyes or is it this dancing juice'),
('Who cares baby I think I wanna marry you'),
('Well I know this little chapel on the boulevard'),
('We can go ooooo'),
('No one will know ooo'),
('Oh come on girl'),
('Who cares if we''re trashed'),
('Got a pocket full of cash we can blow whoa whoa'),
('Shots of patrol whoa whoa'),
('And it''s on girl'),
('Don''t say no no no no no'),
('Just say yeah yeah yeah yeah yeah'),
('If you''re ready like I''m ready'),
('I''ll go get the ring'),
('Let the choir bell sing like ooh ooh ooh'),
('So what you wanna do ooh ooh'),
('Let''s just run girl'),
('If we wake up and you want to break up'),
('That''s cool ooh ooh'),
('No I won''t blame you ooh ooh'),
('It was fun girl'),
('And we''ll go go go go go'),
('Just say I do ooh ooh ooh'),
('Tell me right now baby'),
('Tell me right now baby baby');

lenguaje natural

El lenguaje natural, que también es el modo de búsqueda predeterminado, significa consultar documentos con la palabra especificada. Los dos métodos siguientes son equivalentes:

SELECT title, MATCH(title) AGAINST('baby') AS relevance FROM full_text_test order by relevance desc;
SELECT title, MATCH(title) AGAINST('baby' in NATURAL LANGUAGE MODE) AS relevance FROM full_text_test order by relevance desc;

Match()Especifique la columna que se buscará, Against()especifique la expresión de búsqueda que se utilizará y Match()el valor pasado debe FULLTEXT()ser el mismo que en la definición. Si especifica varias columnas, deben enumerarse (y en el orden correcto). Las búsquedas de texto completo no distinguen entre mayúsculas y minúsculas a menos que se utilice el modo BINARIO.

Booleano

Indica que los caracteres antes y después de la cadena tienen significados especiales. +Indica existencia, -el símbolo indica ausencia. Por ejemplo, para buscar registros que contengan casarse pero no preocuparse:

SELECT title FROM full_text_test WHERE MATCH(title) AGAINST('+marry' in BOOLEAN MODE);-- 返回2条记录
SELECT title FROM full_text_test WHERE MATCH(title) AGAINST('+marry -cares' in BOOLEAN MODE);-- 返回1条记录

Explicación del símbolo:

  • +: Debe aparecer
  • -: No debe aparecer, se usa para excluir los resultados de otros operadores, si solo se especifica esto no se devolverá nada.
  • 无符号: Por defecto, representa o, búsqueda automática de segmentación de palabras. El mismo resultado que si no se especifica EN MODO BOOLEANO.
  • @distance: Se utiliza para comprobar si dos o más palabras están dentro de una distancia especificada. Especifique el término de búsqueda entre comillas dobles antes de la distancia @, como MATCH(col1) AGAINST('"palabra1 palabra2 palabra3" @8' EN MODO BOOLEANO
  • >: Aumenta el valor de peso de los datos coincidentes.
  • <: Reduce el valor de peso de los datos coincidentes.
  • (): Equivale a la agrupación de expresiones, igual que las expresiones en matemáticas.
  • ~: Cambie su correlación de positiva a negativa, lo que indica que tener esta palabra reducirá la correlación. Por ejemplo, +apple ~macintoshApple coincide primero, pero si también se incluye Macintosh, la clasificación será menor.
  • *: comodín, sólo se puede utilizar después de una cadena
  • ": Coincidencia exacta, la palabra entre comillas dobles debe coincidir en su totalidad

Ejemplo:
apple banana
Contiene uno de manzana o plátano.
+apple +juice
Debe contener manzana y jugo
+apple macintosh
. Contiene manzana, pero si contiene ambos Macintosh, se clasificará más arriba. Contiene
+apple -macintosh
manzana pero no contiene Macintosh.
+apple ~macintosh
Contiene manzana. Si contiene ambos Macintosh, el El peso se reducirá.
apple*
Las líneas que contengan la palabra manzana, applesauceetc. se relacionarán con
"some words"
líneas que coincidan exactamente con algunas palabras.
+apple +(>turnover <strudel)

  1. Contiene manzana y volumen de ventas, o contiene manzana y strudel
  2. Los registros que contienen manzana y volumen de negocios tienen pesos más altos que los registros que contienen manzana y strudel

expansión de consultas

Agregado WITH QUERY EXPANSIONo IN NATURAL LANGUAGE MODE WITH QUERY EXPANSIONhabilitado, realizará dos búsquedas, la primera búsqueda usando la frase dada y la segunda búsqueda combinada con las primeras filas más relevantes.

La siguiente declaración de consulta:

SELECT * FROM full_text_test WHERE MATCH (title) AGAINST ('fruit' WITH QUERY EXPANSION);

Al ejecutar, primero se ejecutará una consulta básica, es decir, una consulta en lenguaje natural:

SELECT * FROM full_text_test WHERE MATCH (title) AGAINST ('fruit' IN NATURAL LANGUAGE MODE);

Luego, la segunda consulta utilizará los resultados de la primera consulta como frase de entrada y finalmente obtendrá los resultados de la consulta en orden descendente según la relevancia.

En otras palabras, si una determinada cadena no contiene una frase de palabras clave, también puede aparecer en el conjunto de resultados de la expansión de la consulta fruitsi contiene palabras clave.apple

referencia

Supongo que te gusta

Origin blog.csdn.net/lonelymanontheway/article/details/129373098
Recomendado
Clasificación