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ódigoVerifique instantaneamente o uso do índice ao confirmar a presença do operador
FtsTableScanna saída do comandoEXPLAIN
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_querydefinida comoONna 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 |
Mais indicado para |
|
token |
|
Textos em inglês ou strings formatadas — segmentação por espaços e pontuação |
|
ngram |
|
Correspondência aproximada em qualquer idioma — divide o texto em blocos de caracteres de tamanho fixo (requer o parâmetro |
|
jieba |
|
Busca semântica em chinês — tokenizer baseado em dicionário |
|
ik |
|
Busca em chinês — utiliza o IK Analyzer, uma solução open source amplamente adotada |
|
json |
|
Colunas JSON — extrai conteúdo por meio de uma expressão JSONPath (requer o parâmetro |
|
whole |
|
Consultas de correspondência exata ( |
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)";
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 |
|
|
|
Tipo de tokenizer. Consulte Escolha um tokenizer. |
Todos |
|
|
|
|
Todos |
|
|
— |
Comprimento do token para o tokenizer N-gram. Intervalo válido: |
Apenas |
|
|
|
Modo do tokenizer. jieba ( |
|
|
|
|
|
Todos |
|
|
|
|
Todos |
|
|
|
|
Todos |
|
|
|
Tamanho do segmento do índice invertido. |
Todos |
|
|
|
Quantidade mínima de blocos de dados do column store por construção de índice. |
Todos |
|
|
|
Quantidade máxima de blocos de dados do column store por construção de índice. |
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 |
|
|
Global |
ON |
Permite índices invertidos em nós de column store. Compatível com tipos de dados string e JSON. |
|
|
Global/Sessão |
OFF |
Habilita consultas com índice de texto completo. Deve ser definida como |
|
|
Global |
8 |
Quantidade mínima de blocos de dados do column store por construção de índice. Intervalo: 0–8192. Defina como |
|
|
Global |
128 |
Quantidade máxima de blocos de dados do column store por construção de índice. Intervalo: 0–8192. |
|
|
Global |
536870912 (512 MB) |
Tamanho do segmento para construções de índice invertido, em bytes. Intervalo: 0–4294967295. |
|
|
Global |
DBNodeClassMemory × 10% |
Capacidade do cache LRU para dicionários de índice invertido. Intervalo: [DBNodeClassMemory × 10%, DBNodeClassMemory × 50%]. |
|
|
Global/Sessão |
ON |
Ativa a otimização de pré-filtragem para índices invertidos. |
|
|
Global/Sessão |
OFF |
Converte consultas |
|
|
Global/Sessão |
OFF |
Converte |
|
|
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.