Todos os produtos
Search
Central de documentação

PolarDB:IMCI full-text index

Última atualização: Jun 29, 2026

O In-Memory Column Index (IMCI) do PolarDB for MySQL oferece suporte a índices de texto completo baseados em índices invertidos. Após ativar esse recurso, execute buscas de texto com latência de milissegundos usando a sintaxe MATCH...AGAINST ou consultas LIKE aceleradas, sem necessidade de varredura completa da tabela.

Com os índices de texto completo do IMCI, você pode:

  • Pesquisar colunas de texto diretamente via SQL, sem depender de um mecanismo de busca externo

  • Escolha entre seis tokenizers adequados ao seu idioma e padrão de consulta (inglês, chinês, N-gram, JSON, entre outros)

  • Acelerar consultas LIKE '%keyword%' existentes sem alterar o código

  • Verifique instantaneamente o uso do índice ao confirmar a presença do operador FtsTableScan na saída do comando EXPLAIN

Para entender como a busca de texto completo do IMCI funciona internamente, consulte Análise dos recursos de recuperação de texto completo em índices columnstore.

Requisitos de versão

Versão do PolarDB for MySQL

Versão secundária mínima

8.0.1

8.0.1.1.52

8.0.2

8.0.2.2.32

Pré-requisitos

Antes de começar, confirme que você possui:

  • Um cluster PolarDB for MySQL compatível com as versões listadas acima

  • Uma tabela com o column store ativado (COMMENT 'columnar=1')

  • A variável de sistema imci_enable_fts_query definida como ON na sessão em que as consultas serão executadas

Escolha um tokenizer

Selecione o tokenizer conforme o tipo de dado e o padrão de busca desejado. Cada tokenizer segmenta o texto de forma distinta e atende a diferentes cenários de consulta.

Tokenizer

**Valor de type**

Mais indicado para

token

0 (padrão)

Textos em inglês ou strings formatadas — segmentação por espaços e pontuação

ngram

1

Correspondência aproximada em qualquer idioma — divide o texto em blocos de caracteres de tamanho fixo (requer o parâmetro len)

jieba

2

Busca semântica em chinês — tokenizer baseado em dicionário

ik

3

Busca em chinês — utiliza o IK Analyzer, uma solução open source amplamente adotada

json

4

Colunas JSON — extrai conteúdo por meio de uma expressão JSONPath (requer o parâmetro expr)

whole

5

Consultas de correspondência exata (= ou IN) — indexa toda a coluna como um único termo

Não sabe qual escolher? Visualize como cada tokenizer processa seu texto antes de criar o índice:

CALL dbms_imci.fts_tokenize("I am PolarDB");
-- Result: ["i", "am", "polardb"]  (default: token, type=0)

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

CALL dbms_imci.fts_tokenize("I am PolarDB", "type=2");
-- Result: ["PolarDB"]  (jieba, accurate mode)

CALL dbms_imci.fts_tokenize("I am PolarDB", "type=2,mode=1");
-- Result: ["polardb"]  (jieba, full mode)

Crie um índice de texto completo

Defina o COMMENT no nível da tabela como columnar=1 e o COMMENT no nível da coluna como imci_fts(type=VALUE) para configurar um índice invertido nessa coluna.

Crie o índice durante a criação da tabela:

CREATE TABLE t1 (
    id    INT PRIMARY KEY,
    title VARCHAR(32) COMMENT "imci_fts(type=2)"
) CHARSET utf8mb4 COMMENT 'columnar=1';

Adicione ou modifique um índice em uma coluna existente:

ALTER TABLE t1 MODIFY title VARCHAR(32) COMMENT "imci_fts(type=2,mode=0)";
Importante

Alterar o COMMENT da coluna pode acionar uma reconstrução completa do índice invertido. Em tabelas grandes, execute essa operação fora dos horários de pico.

Após a conclusão do comando ALTER, o IMCI constrói o índice em segundo plano. Execute consultas somente após o término da construção — acompanhe o progresso pelos comandos de monitoramento descritos em Monitorar status de construção do índice.

Remova um índice:

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

Parâmetros de configuração do índice

Utilize estes parâmetros no imci_fts(...) do COMMENT da coluna para ajustar o comportamento do tokenizer e as definições de construção.

Parâmetro

Padrão

Descrição

Tokenizers aplicáveis

type

0

Tipo de tokenizer. Consulte Escolha um tokenizer.

Todos

enable

1

1: cria o índice. 0: exclua o índice.

Todos

len

Comprimento do token para o tokenizer N-gram. Intervalo válido: [2, 256).

Apenas type=1

mode

0

Modo do tokenizer. jieba (type=2): 0 = preciso (padrão), 1 = completo, 2 = mecanismo de busca. IK (type=3): 0 = inteligente (padrão), 1 = granularidade máxima. JSON (type=4): 0 = modo array.

type=2, 3, 4

score

0

1: ativa o cálculo de frequência de termo (TF) e frequência de documento (DF) para permitir ordenação por relevância em MATCH...AGAINST. 0: desativado (padrão).

Todos

stop_word

0

1: ativa filtragem de stop words. 0: desativado (padrão).

Todos

case_sensitive

0

1: correspondência diferencia maiúsculas de minúsculas. 0: não diferencia maiúsculas de minúsculas (padrão).

Todos

seg_size

0

Tamanho do segmento do índice invertido. 0: usa a variável de sistema imci_fts_build_segment_size. Outros valores: definem o tamanho exato.

Todos

pack_cnt_min

0

Quantidade mínima de blocos de dados do column store por construção de índice. 0: usa imci_fts_build_packcnt_min.

Todos

pack_cnt_max

0

Quantidade máxima de blocos de dados do column store por construção de índice. 0: usa imci_fts_build_packcnt_max.

Todos

Execute consultas de texto completo

Ative o suporte a consultas de texto completo na sessão antes de executar as consultas:

SET imci_enable_fts_query = ON;

Use MATCH...AGAINST

A sintaxe MATCH...AGAINST é a principal forma de realizar buscas de texto completo. Ela oferece alto desempenho e permite consultas booleanas e pontuação de relevância.

-- Insert sample data
INSERT INTO t1 VALUES
    (16, 'polarDB full-text index feature title'),
    (17, 'database title performance optimization');

-- Find rows where the title column contains "title"
SELECT * FROM t1 WHERE MATCH(title) AGAINST("title");

Execute EXPLAIN para confirmar se a consulta utiliza o índice de texto completo. Verifique a presença do operador FtsTableScan:

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%")             |
+----+------------------------+------+-----------------------------------------------------------------+

O campo Fallback indica que, para dados incrementais ainda não indexados, a consulta recorre automaticamente a uma varredura com LIKE para garantir resultados completos.

Se FtsTableScan não aparecer na saída, a consulta não está usando o índice de texto completo. Geralmente, isso ocorre porque imci_enable_fts_query está definido como OFF. Consulte a seção FAQ para outras etapas de solução de problemas.

Acelere consultas LIKE

Para acelerar consultas LIKE '%keyword%' no código existente da aplicação sem reescrevê-las, ative a conversão automática para MATCH...AGAINST:

SET imci_convert_like_to_match = ON;

Após definir essa variável, as consultas LIKE em colunas indexadas são convertidas automaticamente:

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%")             |
+----+------------------------+------+-----------------------------------------------------------------+

A presença de FtsTableScan na saída confirma que a consulta LIKE foi acelerada.

Recurso de fallback de MATCH para LIKE

Caso não exista um índice de texto completo na coluna, ative a conversão automática de MATCH para LIKE para que as consultas continuem retornando resultados corretos:

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%")                                    |
+----+----------------------+------+-----------------------------------------------------------------+

O plano de execução mostra uma varredura completa da tabela. Isso garante resultados corretos, mas não utiliza o índice.

Monitore o status de construção do índice

Após criar ou modificar um índice de texto completo, acompanhe o progresso da construção com estes comandos:

-- List all inverted indexes
SHOW imci indexes fulltext;
SELECT * FROM information_schema.imci_fts_indexes;

-- Filter to a specific table
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 index metadata
SELECT * FROM information_schema.imci_fts_index_metas
    WHERE schema_name = '[db_name]' AND table_name = '[table_name]' AND column_name = '[column_name]';

-- View segment data
SELECT * FROM information_schema.imci_fts_index_segs
    WHERE schema_name = '[db_name]' AND table_name = '[table_name]' AND column_name = '[column_name]';

-- View column store data
SELECT * FROM information_schema.imci_fts_index_packs
    WHERE schema_name = '[db_name]' AND table_name = '[table_name]' AND column_name = '[column_name]';

Variáveis de sistema

Essas variáveis de sistema controlam o comportamento global de construção de índices e a conversão de consultas. Defina as variáveis globais no console do PolarDB — elas não podem ser alteradas pela linha de comando. Já as variáveis com escopo de sessão podem ser configuradas por conexão.

Variável

Escopo

Padrão

Descrição

imci_enable_fts

Global

ON

Permite índices invertidos em nós de column store. Compatível com tipos de dados string e JSON.

imci_enable_fts_query

Global/Sessão

OFF

Habilita consultas com índice de texto completo. Deve ser definida como ON antes de executar MATCH...AGAINST.

imci_fts_build_pack_cnt_min

Global

8

Quantidade mínima de blocos de dados do column store por construção de índice. Intervalo: 0–8192. Defina como 0 para pausar a construção.

imci_fts_build_pack_cnt_max

Global

128

Quantidade máxima de blocos de dados do column store por construção de índice. Intervalo: 0–8192.

imci_fts_build_segment_size

Global

536870912 (512 MB)

Tamanho do segmento para construções de índice invertido, em bytes. Intervalo: 0–4294967295.

imci_fts_lru_cache_capacity

Global

DBNodeClassMemory × 10%

Capacidade do cache LRU para dicionários de índice invertido. Intervalo: [DBNodeClassMemory × 10%, DBNodeClassMemory × 50%].

imci_enable_fts_pruner

Global/Sessão

ON

Ativa a otimização de pré-filtragem para índices invertidos.

imci_convert_like_to_match

Global/Sessão

OFF

Converte consultas LIKE para MATCH...AGAINST para usar o índice invertido. Valores: ON, OFF, ONLY_MATCH (ativa e ignora a expressão LIKE original).

imci_enable_query_fts_like

Global/Sessão

OFF

Converte MATCH...AGAINST para LIKE quando não há índice de texto completo.

imci_enable_match_expr_fallback

Global/Sessão

ON

Permite que as consultas usem um caminho de execução mais lento quando o índice invertido estiver indisponível ou ainda em construção.

FAQ

Minha consulta não está usando o índice de texto completo. O que houve?

Na maioria dos casos, isso acontece porque imci_enable_fts_query ainda está definido como OFF. Execute SET imci_enable_fts_query = ON; e tente novamente.

Se o índice continuar sem ser utilizado, verifique a saída do EXPLAIN. Caso FtsTableScan não apareça, o padrão da consulta pode não corresponder ao índice, ou o otimizador de consultas optou por uma varredura completa da tabela devido ao custo estimado menor.

Qual tokenizer devo usar?

Comece com o padrão type=0 (token) para textos em inglês ou estruturados. Para conteúdo em chinês, utilize type=2 (jieba) no modo preciso para busca semântica, ou type=3 (IK Analyzer) como alternativa. Para colunas JSON, prefira type=4 (json) com o parâmetro expr para especificar o JSONPath a ser indexado.

Para validar sua escolha antes de criar o índice, visualize os resultados da tokenização com dbms_imci.fts_tokenize. Consulte Escolha um tokenizer.

Qual é a diferença entre LIKE e MATCH...AGAINST?

O uso de LIKE '%keyword%' sem um índice de texto completo provoca uma varredura completa da tabela. Já MATCH...AGAINST aproveita o índice invertido para buscas rápidas, além de oferecer suporte a consultas booleanas e pontuação de relevância. Para novas aplicações, use MATCH...AGAINST diretamente. Se o código existente já utilizar LIKE, ative imci_convert_like_to_match para obter aceleração por índice sem precisar reescrever as consultas.

Próximos passos