Todos los productos
Search
Centro de documentos

PolarDB:Guía de uso del índice de texto completo de IMCI

Última actualización: Oct 10, 2026

Este tema describe cómo compilar y usar índices de texto completo en el In-Memory Column Index (IMCI) de PolarDB for MySQL. Configure un índice invertido mediante un COMMENT a nivel de columna para lograr búsquedas aproximadas en milisegundos con la sintaxis MATCH...AGAINST o con consultas LIKE optimizadas automáticamente. Esta función se basa en el mecanismo de índice invertido y coincidencia de términos de IMCI. Para obtener más detalles sobre su funcionamiento, consulte An analysis of the full-text search feature in IMCI.

Alcance

La versión de su clúster debe cumplir los siguientes requisitos:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.52 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.32 o posterior.

Sintaxis

PolarDB IMCI le permite crear, modificar o eliminar un índice invertido. Para ello, especifique un comment de columna al crear una tabla, o bien modifique el comment de la columna mediante DDL.

Formato de sintaxis

  • Defina un índice de texto completo al crear una tabla:

    CREATE TABLE table_name (
        column_name Data_Type COMMENT "imci_fts(type=VALUE [,KEY=VALUE])"
    ) COMMENT 'columnar=1';
  • Utilice ALTER para modificar una columna y agregar o cambiar un índice:

    ALTER TABLE table_name MODIFY column_name Data_Type COMMENT "imci_fts(type=VALUE [,KEY=VALUE])";
    Importante

    Modificar COMMENT puede desencadenar la recompilación del índice invertido. En tablas grandes, ejecute esta operación fuera del horario de mayor actividad.

  • Use ALTER para modificar una columna y eliminar el índice:

    ALTER TABLE table_name MODIFY column_name Data_Type COMMENT 'imci_fts(enable=0)';

Parámetros:

En el COMMENT a nivel de tabla, establezca 'columnar=1' para crear una tabla columnar de IMCI. El índice de texto completo se configura mediante el COMMENT de la columna, con el formato imci_fts(TYPE=VALUE[, KEY=VALUE]...). El parámetro TYPE es obligatorio y KEY es opcional. Separe varios valores de KEY con comas.

  • Tipo de tokenizer (parámetro type):

    Tokenizer

    typevalor

    Descripción

    token

    0 (predeterminado)

    Divide el texto en tokens mediante espacios, signos de puntuación y otros caracteres no alfanuméricos. Recomendado para inglés o texto con formato.

    ngram

    1

    Divide los caracteres en segmentos de longitud fija (controlada por el parámetro len). Adecuado para coincidencias aproximadas en cualquier idioma.

    jieba

    2

    Tokenizer para chino basado en diccionario. Diseñado para escenarios de búsqueda semántica en chino.

    ik

    3

    Otro tokenizer de uso común para chino.

    json

    4

    Compila un índice a partir del contenido extraído de un campo JSON mediante una expresión JSONPath (requiere el parámetro expr).

    whole

    5

    No divide el texto en tokens. Trata todo el valor de la columna como un solo término. Se usa principalmente para acelerar consultas de igualdad (como = o in).

    mysql ngram

    6

    El tokenizer ngram compatible con MySQL.

    Nota

    Este parámetro aplica únicamente a las siguientes versiones:

    • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

    • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

  • Descripción de los parámetros de configuración (KEY-VALUE):

    Nombre del parámetro (KEY)

    Valor predeterminado

    Descripción del valor

    Tipos de tokenizer aplicables (type)

    enable

    1

    • 1: crea el índice invertido (valor predeterminado)

    • 0: elimina el índice invertido

    Todos

    type

    0

    Especifica el tipo de tokenizer (consulte la tabla anterior)

    Todos

    len

    -

    Tokenizer ngram: longitud de tokenización. Valores válidos: [1, 256)

    type=1 (ngram), type=6 (mysql ngram)

    mode

    0

    Modo del tokenizer:

    • jieba (type=2):

      • 0: modo exacto (predeterminado)

      • 1: modo completo

      • 2: modo de motor de búsqueda

    • ik (type=3):

      • 0: modo inteligente (predeterminado)

      • 1: modo de granularidad más fina

    • json (type=4):

      • 0: modo de arreglo heredado (predeterminado)

      • 1: modo de arreglo

      • 2: modo de clave-valor, por ejemplo ".id" y "[].id".

    type=2, 3, 4

    score

    0

    Indica si se admite la ordenación:

    • 0: no genera estadísticas de frecuencia de términos (TF) ni de frecuencia de documentos (DF), e ignora la ordenación (predeterminado)

    • 1: habilitado. Admite la ordenación por puntuación de relevancia basada en MATCH... AGAINST.

    Nota

    Esta función solo está disponible en las siguientes versiones:

    • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

    • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

    Todos

    seg_size

    0

    Especifica el tamaño de segmento del índice invertido:

    • 0: utiliza el valor de la variable del sistema imci_fts_build_segment_size

    • Otros valores: especifique un tamaño de segmento concreto

    Todos

    pack_cnt_min

    0

    Número mínimo de unidades de datos para compilar el índice invertido:

    • 0: utiliza el valor de la variable del sistema imci_fts_build_packcnt_min

    • Otros valores: especifique un tamaño de segmento concreto

    Todos

    pack_cnt_max

    0

    Número máximo de unidades de datos para compilar el índice invertido:

    • 0: utiliza el valor de la variable del sistema imci_fts_build_packcnt_max

    • Otros valores: especifique un tamaño de segmento concreto

    Todos

    stop_word

    0

    Indica si se admiten palabras vacías:

    • 0: no admitido (predeterminado)

    • 1: admitido

    Nota

    Esta función solo está disponible en las siguientes versiones:

    • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

    • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

    Todos

    case_sensitive

    0

    Indica si el índice distingue entre mayúsculas y minúsculas:

    • 0: no distingue entre mayúsculas y minúsculas (predeterminado)

    • 1: distingue entre mayúsculas y minúsculas

    • 2: determinado por el collate de la columna (modo compatible con MySQL)

    • 3: determinado por el collate de la columna (definido completamente por collate)

    Todos

    phrase

    0

    Indica si se registra información de posición para consultas de frases:

    • 0: no registra información de posición (predeterminado)

    • 1: registra información de posición

    Nota

    Este parámetro aplica únicamente a las siguientes versiones:

    • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

    • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

    Todos

    synonym

    0

    Indica si se admiten sinónimos:

    • 0: no admitido (predeterminado)

    • 1: admitido, modo de consulta

    • 2: admitido, modo de índice (requiere recompilar el índice invertido)

    Nota

    Esta función solo está disponible en las siguientes versiones:

    • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

    • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

    Todos

Ejemplos

1. Crear un índice de texto completo

Cree un índice de texto completo en cada columna que requiera recuperación de texto y seleccione un tokenizer según sus necesidades de negocio.

  1. Crear una tabla de prueba: cree una tabla que contenga un índice columnar.

    CREATE TABLE t1 (
        id INT PRIMARY KEY,
        title VARCHAR(32) COMMENT "imci_fts(type=2)"
    )CHARSET utf8mb4 COMMENT 'columnar=1';
  2. (Opcional) Modificar el índice de texto completo: utilice la instrucción ALTER TABLE para agregar un índice de texto completo a la columna title y especifique el modo de motor de búsqueda del tokenizer jieba.

    ALTER TABLE t1 MODIFY title VARCHAR(32) COMMENT "imci_fts(type=2,mode=0)";
  3. (Opcional) Comprobar el resultado de la tokenización: antes de seleccionar un tokenizer, use la función dbms_imci.fts_tokenize para previsualizar cómo procesan el texto los distintos tokenizers.

    CALL dbms_imci.fts_tokenize("I am PolarDB");
    -- Result: ["i", "am", "polardb"]  
    
    CALL dbms_imci.fts_tokenize("I am PolarDB", "type=1");
    -- Result: ["i ", " a", "am", "m ", " p", "po", "ol", "ar", "rd", "db"]
    
    CALL dbms_imci.fts_tokenize("I am PolarDB", "type=2");
    -- Result: ["PolarDB"]
    
    CALL dbms_imci.fts_tokenize("I am PolarDB", "type=2,mode=1");
    -- Result: ["polardb"]

2. Ejecutar consultas de búsqueda de texto completo

Una vez creado el índice, IMCI lo compila en segundo plano. Cuando finaliza la compilación, ejecute consultas de texto mediante instrucciones MATCH...AGAINST o LIKE optimizadas.

  1. Consultar con MATCH...AGAINST:

    -- Insert sample data
    INSERT INTO t1 VALUES 
    (16, 'polarDB full-text index feature title'), 
    (17, 'Database title performance tuning');
    -- Query records whose title column contains "index"
    SELECT * FROM t1 WHERE MATCH(title) AGAINST("title");

    Utilice EXPLAIN para consultar el plan de ejecución. Ahí observará el operador FtsTableScan, que indica que la consulta utilizó el índice de texto completo.

    EXPLAIN SELECT * FROM t1 WHERE MATCH(title) AGAINST("title") AND id > 10;
    +----+------------------------+------+-----------------------------------------------------------------+
    | ID | Operator               | Name | Extra Info                                                      |
    +----+------------------------+------+-----------------------------------------------------------------+
    |  1 | Select Statement       |      | IMCI Execution Plan (max_dop = 32, max_query_mem = 41230008320) |
    |  2 | └─Compute Scalar       |      |                                                                 |
    |  3 |   └─FILTER             |      | Cond:(t1.id > 10)                                              |
    |  4 |     └─FtsTableScan     | t1   | Term:("title") Fallback:(t1.title LIKE "%title%")             |
    +----+------------------------+------+-----------------------------------------------------------------+

    Fallback indica que, para los datos incrementales aún no indexados, el sistema utiliza automáticamente LIKE para ejecutar un escaneo complementario. Esto garantiza que los resultados sean completos.

  2. Acelerar consultas LIKE: para mantener la compatibilidad con el código de negocio existente, IMCI convierte automáticamente ciertas consultas LIKE en MATCH...AGAINST y así acelerarlas.

    SET imci_convert_like_to_match = on;
    EXPLAIN SELECT * FROM t1 WHERE title  LIKE "%title%";
    +----+------------------------+------+-----------------------------------------------------------------+
    | ID | Operator               | Name | Extra Info                                                      |
    +----+------------------------+------+-----------------------------------------------------------------+
    |  1 | Select Statement       |      | IMCI Execution Plan (max_dop = 32, max_query_mem = 41230008320) |
    |  2 | └─Compute Scalar       |      |                                                                 |
    |  3 |   └─FILTER             |      | Cond:(t1.title LIKE "%title%")                                 |
    |  4 |     └─FtsTableScan     | t1   | Term:("title") Fallback:(t1.title LIKE "%title%")             |
    +----+------------------------+------+-----------------------------------------------------------------+

    El plan de ejecución también muestra el operador FtsTableScan, lo cual confirma que la consulta LIKE se aceleró.

  3. Conversión de match a like: cuando no hay ningún índice de texto completo disponible, IMCI convierte MATCH en LIKE para que la consulta se ejecute correctamente y aproveche al máximo los índices existentes. El plan de ejecución muestra un escaneo completo de la tabla.

    SET imci_enable_query_fts_like = on;
    EXPLAIN SELECT * FROM t1 WHERE MATCH(title) AGAINST("title");
    +----+----------------------+------+-----------------------------------------------------------------+
    | ID | Operator             | Name | Extra Info                                                      |
    +----+----------------------+------+-----------------------------------------------------------------+
    |  1 | Select Statement     |      | IMCI Execution Plan (max_dop = 32, max_query_mem = 41230008320) |
    |  2 | └─Compute Scalar     |      |                                                                 |
    |  3 |   └─Table Scan       | t1   | Cond:(title LIKE "%title%")                                    |
    +----+----------------------+------+-----------------------------------------------------------------+

3. Gestionar y supervisar índices

Consulte el estado de compilación y los metadatos de un índice, y elimínelo cuando ya no lo necesite.

  1. Supervise el progreso y el estado de compilación del índice:

    -- View all inverted indexes
    SHOW imci indexes fulltext;
    SELECT * FROM information_schema.imci_fts_indexes;
    
    -- View a specified inverted index
    SHOW imci indexes fulltext FOR [db_name].[table_name];
    SELECT * FROM information_schema.imci_fts_indexes 
    WHERE schema_name='[db_name]' AND table_name='[table_name]';
    
    -- View the metadata of a specified inverted index
    SELECT * FROM information_schema.imci_fts_index_metas 
    WHERE schema_name='[db_name]' AND table_name='[table_name]' AND column_name='[column_name]';
    
    -- View the segment data of a specified inverted index
    SELECT * FROM information_schema.imci_fts_index_segs 
    WHERE schema_name='[db_name]' AND table_name='[table_name]' AND column_name='[column_name]';
    
    -- View the columnar data of a specified inverted index
    SELECT * FROM information_schema.imci_fts_index_packs 
    WHERE schema_name='[db_name]' AND table_name='[table_name]' AND column_name='[column_name]';
  2. Eliminar un índice de texto completo: si ya no necesita el índice de texto completo de una columna, modifique el COMMENT de dicha columna para eliminarlo.

    ALTER TABLE t1 MODIFY title VARCHAR(255) COMMENT 'imci_fts(enable=0)';

4. Parámetros de configuración principales

Nombre del parámetro

Nivel

Descripción

imci_enable_fts

Global

Indica si se pueden crear índices invertidos en los nodos columnares.

  • ON (predeterminado): habilitado. Admite tipos como cadenas y JSON.

  • OFF: deshabilitado.

imci_enable_fts_query

Global / Session

Indica si se pueden usar índices invertidos en los nodos columnares.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_fts_build_pack_cnt_min

Global

Número mínimo de bloques de datos columnares para cada índice invertido durante la compilación del índice.

Valores válidos: de 0 a 8192. Valor predeterminado: 8. El valor 0 indica que el índice no se compila por el momento.

imci_fts_build_pack_cnt_max

Global

Número máximo de bloques de datos columnares para cada índice invertido durante la compilación del índice.

Valores válidos: de 0 a 8192. Valor predeterminado: 128.

imci_fts_build_segment_size

Global

Tamaño del segmento de cada índice invertido durante la compilación del índice.

Valores válidos: de 0 a 4294967295. Valor predeterminado: 536870912 (512 MB). Unidad: bytes.

imci_fts_lru_cache_capacity

Global

Espacio de caché del diccionario para los índices invertidos.

Valores válidos: [DBNodeClassMemory1/10~DBNodeClassMemory1/2]. Valor predeterminado: [DBNodeClassMemory*10/100].

imci_enable_fts_pruner

Global / Session

Indica si se habilita la optimización de prefiltro del índice invertido.

  • ON (predeterminado): habilitado.

  • OFF: deshabilitado.

imci_convert_like_to_match

Global / Session

Indica si se convierte like en match para acelerar la consulta con el índice invertido.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

  • ONLY_MATCH: habilitado; además, se ignora la expresión like.

imci_enable_query_fts_like

Global / Session

Indica si se convierte match en like.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_enable_match_expr_fallback

Global / Session

Indica si se habilitan las consultas sobre datos incrementales que aún no se han compilado en el índice invertido.

  • ON (predeterminado): habilitado.

  • OFF: deshabilitado.

imci_fts_build_fts_cnt

Global

Nivel de concurrencia para la compilación de índices invertidos.

Valores válidos: de 0 a 512. Valor predeterminado: 4.

Nota

Este parámetro solo aplica a las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.54 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.34 o posterior.

imci_fts_user_dict_table

Global

Diccionario personalizado para el índice de texto completo. Formato: database_name/table_name.

Nota

Este parámetro solo aplica a las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.54 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.34 o posterior.

imci_fts_user_dict_update

Global

Indica si se vuelve a cargar el diccionario personalizado especificado mediante imci_fts_user_dict_table.

  • ON (predeterminado): habilitado.

  • OFF: deshabilitado.

Nota

Este parámetro solo aplica a las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.54 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.34 o posterior.

imci_convert_json_overlap_to_match

Global/Session

Indica si se permite que json_overlaps utilice el índice JSON para acelerar la consulta.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_convert_json_contains_to_match

Global/Session

Indica si se permite que json_contains utilice el índice JSON para acelerar la consulta.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_convert_json_extract_to_match

Global/Session

Indica si se permite que json_extract utilice el índice JSON para acelerar la consulta.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_convert_equal_to_match

Global/Session

Indica si se permite que la expresión = utilice el índice de igualdad para acelerar la consulta.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_convert_in_to_match

Global/Session

Indica si se permite que la expresión IN utilice el índice de igualdad para acelerar la consulta.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_convert_ne_to_match

Global/Session

Indica si se permite que la expresión != utilice el índice de igualdad para acelerar la consulta.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_enable_fts_synonym

Global / Session

Indica si se admiten sinónimos.

  • ON (predeterminado): habilitado.

  • OFF: deshabilitado.

Nota

Este parámetro solo está disponible en las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

imci_enable_fts_parse_term_with_and

Global / Session

Indica si la cadena de consulta tokenizada se evalúa mediante AND.

  • ON (predeterminado): habilitado.

  • OFF: deshabilitado. Se evalúa mediante OR.

imci_enable_fts_parse_term_with_phrase

Global / Session

Indica si, en BOOLEAN MODE, la cadena de consulta tokenizada depende estrictamente de las posiciones.

  • ON: habilitado.

  • OFF (predeterminado): deshabilitado.

imci_fts_stop_word_table

Global

Palabras vacías personalizadas para el índice de texto completo. Formato: database_name/table_name. Para más detalles, consulte Custom stop words.

Nota

Este parámetro solo está disponible en las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

imci_fts_stop_word_update

Global

Indica si se vuelven a cargar las palabras vacías personalizadas especificadas mediante imci_fts_stop_word_table.

  • ON (predeterminado): habilitado.

  • OFF: deshabilitado.

Nota

Este parámetro solo está disponible en las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

imci_fts_synonym_table

Global

Sinónimos personalizados para el índice de texto completo. Formato: database_name/table_name. Para más detalles, consulte Custom synonyms.

Nota

Este parámetro solo está disponible en las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

imci_fts_synonym_update

Global

Indica si se vuelven a cargar los sinónimos personalizados especificados mediante imci_fts_synonym_table.

  • ON (predeterminado): habilitado.

  • OFF: deshabilitado.

Nota

Este parámetro solo está disponible en las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

Importante

Los parámetros de nivel GLOBAL no se pueden modificar directamente desde la línea de comandos. Solo es posible configurarlos en la consola. Cuando se ejecuta uno de estos parámetros desde la línea de comandos, la operación se trata de forma predeterminada como una operación de nivel SESSION.

Diccionarios personalizados

La función de índice de texto completo de IMCI admite diccionarios personalizados implementados mediante tablas personalizadas. Estos diccionarios generan resultados de tokenización que se ajustan mejor a sus escenarios de negocio.

Crear una tabla de diccionario personalizado

  1. Primero, defina una tabla con la misma estructura que la tabla my_fts_dict. Los nombres de las columnas deben coincidir con los de dicha tabla.

    • type: el tipo de tokenizer. Solo se admiten el tokenizer jieba (tipo 2) y el tokenizer ik (tipo 3).

    • word: la palabra de la entidad.

    • is_added: agrega al diccionario personalizado (valor 1) o lo quita de este (valor 2).

    CREATE TABLE my_fts_dict (
      `type` INT UNSIGNED NOT NULL COMMENT '2 for jieba, 3 for ik',
      `word` VARCHAR(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'dict word',
      `is_added` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1 for add, 2 for delete'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='imci fts user dict';
  2. El diccionario personalizado es una tabla InnoDB. Las operaciones de lectura y escritura son iguales a las de una tabla normal.

    1. Agregar una entrada:

      INSERT INTO my_fts_dict VALUES(2, "PolarDB", 1)
    2. Quitar una entrada:

      INSERT INTO my_fts_dict(type, word, is_added) VALUES(2, "PolarDB", 2);
      or
      DELETE FROM my_fts_dict WHERE type=2 AND word = "PolarDB";

Configurar un diccionario personalizado

  • Después de crear la tabla del diccionario personalizado, configure el valor de la opción imci_fts_user_dict_table. Por ejemplo, test/my_fts_dict'.

    SET GLOBAL imci_fts_user_dict_table = 'test/my_fts_dict';
  • Si ya se estableció imci_fts_user_dict_table, también puede establecer imci_fts_user_dict_update en ON para activar la recarga del diccionario personalizado indicado en imci_fts_user_dict_table.

    SET GLOBAL imci_fts_user_dict_update = ON;
    Nota

    Un diccionario personalizado nuevo solo surte efecto en los índices invertidos que se compilen después. Para aplicarlo a un índice invertido ya compilado, vuelva a compilar el índice.

Sinónimos personalizados

La función de índice de texto completo de IMCI admite sinónimos personalizados implementados mediante tablas personalizadas.

Nota

La función de sinónimos personalizados solo aplica a las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

Crear una tabla de sinónimos personalizados

Primero, defina una tabla con la misma estructura que la tabla my_synonym_dict. Los nombres de las columnas deben coincidir con los de my_synonym_dict.

  • word: la lista de sinónimos. Separe las distintas palabras con comas.

  • type: el tipo de sinónimo.

    • 0 indica que todas las palabras de la lista son sinónimas entre sí. Por ejemplo, "db,database,polardb" significa "db" <=> "database" <=> "polardb". Es decir, cuando busca "db", "database" o "polardb", se devuelven todos los datos que coinciden con "db", "database" o "polardb".

    • 1 indica que la primera palabra de la lista es el término principal y que las demás son sus sinónimos. Por ejemplo, "db,database,polardb" significa "db" => "database", "polardb". Es decir, cuando busca "db", se devuelven todos los datos que coinciden con "db", "database" o "polardb". Sin embargo, cuando busca "database", solo se devuelven los datos que coinciden con "database".

CREATE TABLE my_synonym_dict (
  `word` VARCHAR(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'comma-separated synonyms',
  `type` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 for equivalent, 1 for mapping'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='imci fts synonym';

El diccionario personalizado es una tabla InnoDB. Las operaciones de lectura y escritura son iguales a las de una tabla normal.

  • Agregar una entrada:

    INSERT INTO my_synonym_dict VALUES("db,database,polardb", 0);
    INSERT INTO my_synonym_dict VALUES("imci,clickhouse,duckdb", 1);
  • Quitar una entrada:

    DELETE FROM my_synonym_dict WHERE type=1 AND word = "imci,clickhouse,duckdb";

Configurar sinónimos personalizados

Después de crear la tabla de sinónimos personalizados, configure el valor de la opción imci_fts_synonym_table. Por ejemplo, test/my_synonym_dict, donde test es el nombre de la base de datos y my_synonym_dict es el nombre de la tabla.

SET GLOBAL imci_fts_synonym_table = 'test/my_synonym_dict';

Si ya se estableció imci_fts_synonym_table, también puede establecer imci_fts_synonym_update en ON para activar la recarga de los sinónimos personalizados indicados en imci_fts_synonym_table.

SET GLOBAL imci_fts_synonym_update = ON;
Nota

Si synonym se establece en modo de índice (por ejemplo, COMMENT "imci_fts(type=0 synonym=1)"), los sinónimos actualizados solo surten efecto en la parte recién agregada del índice invertido. Para aplicarlos a todo el índice, vuelva a compilar el índice de texto completo.

Palabras vacías personalizadas

La función de índice de texto completo de IMCI admite palabras vacías personalizadas implementadas mediante tablas personalizadas.

Nota

La función de palabras vacías personalizadas solo aplica a las siguientes versiones:

  • MySQL 8.0.1, y la versión secundaria del motor debe ser 8.0.1.1.57 o posterior.

  • MySQL 8.0.2, y la versión secundaria del motor debe ser 8.0.2.2.37 o posterior.

Crear una tabla de palabras vacías personalizadas

Primero, defina una tabla con la misma estructura que la tabla my_stop_words. Los nombres de las columnas deben coincidir con los de my_stop_words.

  • word: la palabra vacía.

  • is_added: agrega al diccionario personalizado (valor 1) o lo quita de este (valor 0).

CREATE TABLE my_stop_words (
  `word` VARCHAR(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'stop word',
  `is_added` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1 for add, 0 for delete'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='imci fts stop word';

El diccionario personalizado es una tabla InnoDB. Las operaciones de lectura y escritura son iguales a las de una tabla normal.

  • Agregar una entrada:

    INSERT INTO my_stop_words VALUES("am", 1);
    INSERT INTO my_stop_words VALUES("chinese", 1);
  • Quitar una entrada:

    INSERT INTO my_stop_words(word, is_added) VALUES("chinese", 0);
    -- or
    DELETE FROM my_stop_words WHERE is_added=1 AND word = "chinese";

Configurar palabras vacías personalizadas

Después de crear la tabla de palabras vacías personalizadas, configure el valor de la opción imci_fts_stop_word_table. Por ejemplo, test/my_stop_words, donde test es el nombre de la base de datos y my_stop_words es el nombre de la tabla.

SET GLOBAL imci_fts_stop_word_table = 'test/my_stop_words';

Si ya se estableció imci_fts_stop_word_table, también puede establecer imci_fts_stop_word_update en ON para activar la recarga de las palabras vacías personalizadas indicadas en imci_fts_stop_word_table.

SET GLOBAL imci_fts_stop_word_update = ON;
Nota

Un diccionario personalizado nuevo solo surte efecto en los índices invertidos que se compilen después. Para aplicarlo a un índice invertido ya compilado, vuelva a compilar el índice.

Preguntas frecuentes

P1: ¿Cómo selecciono el tokenizer adecuado?

  • Texto en inglés o con formato: use el tokenizer predeterminado type=0 (token), que divide el texto por espacios y signos de puntuación.

  • Búsqueda precisa en chino: use el modo predeterminado de type=2 (jieba) o de type=3 (ik).

  • Recuperación de contenido JSON: use type=4 (json) junto con el parámetro expr para especificar las rutas JSON que se van a indexar.

  • Puede usar la función dbms_imci.fts_tokenize para previsualizar cómo procesan el texto los distintos tokenizers.

P2: ¿Por qué mi consulta no usa el índice de texto completo?

  1. Compruebe que se haya ejecutado SET imci_enable_fts_query = ON;. Esta es la causa más común.

  2. Revise la salida de EXPLAIN para confirmar si está presente el operador FtsTableScan. Si no aparece, es posible que el patrón de la consulta no coincida o que el sistema haya determinado que un escaneo completo de la tabla tiene un costo menor.

P3: ¿Cuál es la diferencia entre las consultas LIKE y MATCH...AGAINST?

  • LIKE '%keyword%' provoca un escaneo completo de la tabla cuando no existe un índice de texto completo, lo que genera un rendimiento deficiente. Incluso con la aceleración de IMCI, sus capacidades son limitadas.

  • MATCH...AGAINST es una sintaxis diseñada para la recuperación de texto completo. Ofrece un alto rendimiento y también admitirá funciones avanzadas, como consultas booleanas más complejas y ordenamiento por relevancia. Para aplicaciones nuevas, use MATCH...AGAINST.