Todos os produtos
Search
Central de documentação

Hologres:Índice invertido de texto completo

Última atualização: Sep 06, 2026

As versões 4,0 e posteriores do Hologres oferecem suporte a um índice invertido de texto completo. Esse recurso é construído sobre o mecanismo de busca de texto completo de alto desempenho Tantivy. Ele também suporta o algoritmo de pontuação de similaridade BM25, permitindo classificação de documentos, busca por palavras-chave e busca por frases.

Como funciona

Ao gravar texto source no Hologres, o sistema cria um arquivo de índice invertido de texto completo para cada arquivo de dados com base na configuração do índice. O processo começa quando um tokenizador divide o texto em tokens. Em seguida, o índice registra o mapeamento de cada token para seu texto source, juntamente com sua posição e frequência do termo.

Durante uma busca de texto completo, o Hologres primeiro tokeniza o texto da consulta em um conjunto de tokens de consulta. Depois, o sistema utiliza o algoritmo BM25 para calcular uma pontuação de relevância de cada texto source em relação ao conjunto de tokens de consulta. Esse processo viabiliza buscas de texto completo com alta precisão e desempenho.

Considerações

  • No Hologres V4.0 e posterior, os índices invertidos de texto completo são suportados apenas em tabelas de armazenamento colunar e híbrido (linha-coluna), não sendo compatíveis com tabelas de armazenamento por linha.

  • Crie índices invertidos de texto completo apenas em colunas do tipo TEXT, CHAR ou VARCHAR.

  • É possível criar apenas um índice invertido de texto completo por coluna. Para indexar várias colunas, crie um índice separado para cada uma.

  • Após a criação de um índice invertido de texto completo, os arquivos de índice para dados existentes e recém-carregados em massa são construídos de forma assíncrona durante a compactação de dados. Até que o índice seja criado, a pontuação de relevância BM25 para esses dados será 0.

  • O comportamento de indexação para gravações de dados em tempo real varia conforme a versão. Antes da V4.0.8, os índices eram criados sincronamente. A partir da V4.0.8, para melhorar a eficiência de gravação, o sistema atualiza o índice em memória de forma assíncrona a cada segundo. A consulta de dados usando o índice só é possível após a conclusão de uma atualização.

  • Realize buscas de texto completo apenas em colunas que possuam um índice invertido de texto completo. Não há suporte para busca em colunas sem índice.

  • Recomendamos o uso de recursos Serverless para importações de dados em massa. Esses recursos executam a compactação e constroem o índice invertido de texto completo sincronamente durante o processo de importação. Para mais informações, consulte Use Serverless Computing to perform read and write tasks e Use Serverless Computing to perform Compaction tasks. Caso não utilize recursos Serverless, recomendamos acionar manualmente a operação compaction após uma importação em massa ou modificação de índice com o seguinte comando.

    VACUUM <schema_name>.<table_name>;
  • Por padrão, o algoritmo de busca BM25 calcula as pontuações de relevância com base em estatísticas no nível de arquivo. No Hologres V5.0 e posterior, use o parâmetro hg_text_search_bm25_statistics_level para alternar para a pontuação no nível de shard, o que torna as pontuações comparáveis dentro do mesmo shard. Se você mantiver a pontuação padrão no nível de arquivo e importar dados em pequenos lotes, recomendamos acionar manualmente a compactação conforme necessário para mesclar arquivos de dados e melhorar a precisão da busca.

  • Recursos Serverless podem ser utilizados para executar consultas de busca de texto completo.

  • Utilize a tabela a seguir para escolher o tokenizador adequado ao seu cenário:

    Cenário

    Tokenizador

    Descrição

    Extração de palavras-chave de artigos longos

    Jieba

    Suporta descoberta de novas palavras e alternância de modo complexo.

    Busca em texto descritivo em chinês

    IK

    Identifica termos chineses com precisão.

    Busca em texto curto em inglês (estilo título)

    Simple, Whitespace, Standard

    Simples e eficiente. Escolha um com base no seu texto específico.

    Busca aproximada em texto semelhante a logs

    Ngram

    Independente de dicionário e adequado para consultas de texto aproximado.

    Busca baseada em Pinyin para nomes de produtos ou pessoas em chinês

    Pinyin

    Suporta vários cenários de busca em Pinyin chinês, incluindo Pinyin completo, abreviações de primeiras letras e caracteres com múltiplas pronúncias.

Gerencie índices

Crie um índice

Sintaxe

CREATE INDEX [ IF NOT EXISTS ] idx_name ON table_name
       USING FULLTEXT (column_name [ , ... ])
       [ WITH ( storage_parameter [ = value ] [ , ... ] ) ];

Parâmetros

Parâmetro

Descrição

idx_name

O nome do índice.

table_name

O nome da tabela de destino.

column_name

A coluna para o índice invertido de texto completo.

storage_parameter

Especifique os parâmetros para o índice invertido de texto completo. Os seguintes parâmetros são suportados:

  • tokenizer: O nome do tokenizador. Os seguintes tokenizadores são suportados:

    • jieba (padrão na V4.1 e anteriores): Um tokenizador chinês que combina correspondência baseada em regras e modelos estatísticos.

    • whitespace: Um tokenizador que divide o texto por espaços em branco.

    • standard: Um tokenizador baseado nas regras de segmentação do Unicode Standard Annex #29.

    • simple: Um tokenizador que divide o texto por espaços em branco e pontuação.

    • keyword: Um tokenizador que gera todo o campo de entrada como um único token.

    • icu: Um tokenizador para processamento de texto multilíngue.

    • ik (padrão na V4.2 e posteriores): Um tokenizador chinês baseado no IK Analyzer. Ele reconhece automaticamente formatos especiais, como palavras em inglês, endereços de e-mail, URLs (sem ://) e endereços IP. Suportado desde o Hologres V4.0.9.

    • ngram: Um tokenizador de janela deslizante baseado em caracteres que divide o texto em n-grams (sequências contíguas de n caracteres). Melhora a capacidade de recall e correspondência aproximada, sendo adequado para acelerar consultas LIKE e ILIKE. Suportado desde o Hologres V4.0.9.

    • pinyin: Um tokenizador Pinyin. Gera Pinyin para caracteres e palavras chinesas, e pode derivar divisões de Pinyin para strings não chinesas. Isso permite uma geração de Pinyin mais precisa e maior recall de busca. Suportado desde o Hologres V4.0.9.

  • analyzer_params: A configuração do tokenizador, especificada como uma string formatada em JSON.

    • Cada tokenizador possui uma configuração padrão de analyzer_params. Na maioria dos casos, use as configurações padrão especificando apenas o parâmetro tokenizer e omitindo analyzer_params.

    • Algumas dessas configurações podem ser personalizadas. Para mais informações, consulte Advanced operations: Customize tokenizer configurations.

  • index_options: Especifique o nível de detalhe a ser armazenado no índice, o que afeta o armazenamento necessário e os recursos suportados. Suportado desde o Hologres V4.1.9. Para detalhes, consulte index_options configuration abaixo.

Nota

Cada índice suporta apenas um tokenizer e um conjunto de analyzer_params.

A partir da V4.2, novos índices criados sem especificação explícita de tokenizador usam ik como padrão. Índices criados antes da atualização mantêm seu tokenizador original.

Configure index_options

O parâmetro index_options suporta três níveis. Opções de nível superior incluem automaticamente todas as informações dos níveis inferiores: freqs inclui todas as informações de docs, e positions inclui todas as informações de freqs e docs.

Valor

Conteúdo do índice

Impacto e limitações

Casos de uso

positions (padrão)

ID do documento + frequência do termo + posição

Suporte completo a recursos: Suporta consultas de frase e pontuação de relevância padrão.

Cenários gerais de busca de texto completo.

freqs

ID do documento + frequência do termo

Consultas de frase não são suportadas e retornam um erro.

Cenários que exigem pontuação e classificação baseadas na frequência do termo, mas não precisam de correspondência exata de frase.

docs

Apenas ID do documento

  • Como as informações de frequência do termo estão ausentes, a pontuação de relevância ignora as diferenças de frequência (a pontuação TF é a mesma para todos os documentos correspondentes).

  • Consultas de frase não são suportadas e retornam um erro.

Ideal para cenários sensíveis a armazenamento que requerem apenas verificações de existência (filtragem) e não precisam de pontuação de relevância.

Nota

Para índices que usam o tokenizador keyword, o nível de registro é fixado em docs, e a configuração index_options não se aplica.

Exemplos

  • Crie um índice invertido de texto completo com o tokenizador e configuração padrão (jieba na V4.1 e anteriores, ik na V4.2 e posteriores).

    CREATE INDEX idx1 ON tbl 
           USING FULLTEXT (col1);
  • Especifique explicitamente o tokenizador ik e use sua configuração padrão.

    CREATE INDEX idx1 ON tbl 
           USING FULLTEXT (col1)
           WITH (tokenizer = 'ik');
  • Especifique explicitamente uma configuração personalizada de tokenizador: o tokenizador jieba no modo exact com apenas o filtro lowercase.

    CREATE INDEX idx1 ON tbl 
           USING FULLTEXT (col1)
           WITH (tokenizer = 'jieba',
                 analyzer_params = '{"tokenizer":{"type":"jieba","mode":"exact"}, "filter":["lowercase"]}');
  • Defina index_options como freqs ao criar o índice. Isso economiza espaço, mas não suporta consultas de frase. Suportado desde o Hologres V4.1.9.

    CREATE INDEX idx1 ON tbl
           USING FULLTEXT (col1)
           WITH (index_options = 'freqs');
Nota
  • Após criar um índice invertido de texto completo, a compactação constrói os arquivos de índice depois da importação de dados.

  • Recomendamos usar recursos de computação serverless para realizar importações em lote. Esses recursos concluem a compactação e constroem o índice invertido de texto completo sincronamente durante a importação de dados. Para mais informações, consulte Use serverless computing to perform read and write tasks e Use serverless computing to perform compaction tasks.

  • Se não utilizar recursos serverless, recomendamos acionar manualmente a compactação após uma importação em lote ou modificação de índice executando o seguinte comando. Para mais informações, consulte Compaction (Beta).

    VACUUM <schema_name>.<table_name>;

Modifique um índice

Sintaxe

-- Modify index configuration
ALTER INDEX [ IF EXISTS ] <idx_name> SET ( <storage_parameter> = '<storage_value>' [ , ... ] );

-- Reset to default configuration
ALTER INDEX [ IF EXISTS ] <idx_name> RESET ( <storage_parameter> [ , ... ] );

Parâmetros

Para descrições detalhadas dos parâmetros, consulte Parameters.

Exemplos

Nota

Após alterar um índice invertido de texto completo, a compactação constrói os arquivos de índice de forma assíncrona. Recomendamos acionar manualmente a compactação após alterar um índice executando o comando VACUUM <schema_name>.<table_name>;. Para mais informações, consulte Compaction.

  • Altere o tokenizador do índice para standard.

    ALTER INDEX idx1 SET (tokenizer = 'standard');
  • Altere o tokenizador do índice para ik no modo ik_max_word, sem conversão para minúsculas e sem filtros.

    ALTER INDEX idx1 SET (
      tokenizer = 'ik',
      analyzer_params = '{"tokenizer":{"type":"ik","mode":"ik_max_word","enable_lowercase": false}}'
    );
  • Redefina para o tokenizador padrão jieba e use sua configuração padrão de analyzer_params.

    ALTER INDEX idx1 RESET (tokenizer);
    ALTER INDEX idx1 RESET (tokenizer, analyzer_params);
  • Redefina para a configuração padrão de analyzer_params do tokenizador atual.

    ALTER INDEX idx1 RESET (analyzer_params);
  • Altere o index_options do índice para docs.

    ALTER INDEX idx1 SET (index_options = 'docs');
  • Redefina index_options para seu valor padrão, positions.

    ALTER INDEX idx1 RESET (index_options);

Excluir um índice

Sintaxe

DROP INDEX [ IF EXISTS ] <idx_name> [ RESTRICT ];

Parâmetros

Para descrições detalhadas dos parâmetros, consulte Parameters.

Visualize índices

O Hologres fornece a tabela de sistema hologres.hg_index_properties, onde é possível visualizar os índices invertidos de texto completo criados para uma tabela e suas posições correspondentes.

SELECT * FROM hologres.hg_index_properties;

Execute a seguinte instrução SQL para visualizar a tabela e a coluna associadas a um índice.

SELECT 
    t.relname AS table_name, 
    a.attname AS column_name
FROM pg_class t
    JOIN pg_index i ON t.oid = i.indrelid
    JOIN pg_class idx ON i.indexrelid = idx.oid
    JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
WHERE t.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '<namespace>')
    AND idx.relname = '<indexname>'
LIMIT 1;

Parâmetros:

  • namespace: O valor do campo table_namespace na saída do comando SELECT * FROM hologres.hg_index_properties;.

  • indexname: O nome real do índice.

Visualize progresso de construção do índice

Após criar um índice invertido de texto completo, use a função integrada hg_show_build_index_progress para visualizar o progresso de construção do índice em tempo real. Essa função retorna o status de construção de todos os índices de texto completo na tabela especificada.

Exemplo

SELECT * FROM hg_show_build_index_progress('<table_name>');

Notas de uso

  • Para chamar essa função, você deve ter a permissão SELECT na tabela especificada.

  • A função retorna informações de construção para todos os índices de texto completo na tabela, incluindo o número de arquivos construídos, o total de arquivos, o progresso da construção em porcentagem e o tempo restante estimado.

Valores de retorno

O resultado inclui os seguintes campos:

Campo

Tipo de dado

Descrição

schema_name

TEXT

O nome do schema que contém o índice.

table_name

TEXT

O nome da tabela.

index_name

TEXT

O nome do índice.

index_id

BIGINT

O ID exclusivo do índice.

am_name

TEXT

O tipo do índice.

built_index_size

TEXT

O tamanho do índice que foi construído.

built_num_files

INTEGER

O número de arquivos para os quais a construção do índice foi concluída.

target_num_files

INTEGER

O número total de arquivos para os quais o índice precisa ser construído.

progress

TEXT

O progresso da construção, em porcentagem.

estimated_remaining_time

TEXT

O tempo restante estimado para a construção.

Busca de texto completo usando um índice

O Hologres suporta uma variedade de modos de busca, permitindo adaptar as buscas de texto completo à sua lógica de negócios.

Modo de busca

Descrição

Correspondência de palavra-chave

Busca palavras-chave em um objeto de busca tokenizado. É possível definir a relação entre palavras-chave usando lógica AND/OR.

Busca por frase

Busca uma frase completa. Uma correspondência exige que as palavras da frase apareçam dentro de uma distância especificada umas das outras.

Busca em linguagem natural

Permite definir condições de consulta complexas usando sintaxe de linguagem natural. Inclui especificação de lógica AND/OR, termos obrigatórios, termos excluídos e frases.

Busca por termo

Realiza uma correspondência exata para o objeto de busca. O índice deve conter a string de consulta exata para retornar uma correspondência.

Função TEXT_SEARCH

A função TEXT_SEARCH calcula a pontuação de relevância BM25 para uma fonte de busca com base em um objeto de busca.

Sintaxe da função

TEXT_SEARCH (
  <search_data> TEXT/VARCHAR/CHAR
  ,<search_expression> TEXT
  [ ,<mode> TEXT DEFAULT 'match'
  ,<operator> TEXT DEFAULT 'OR'
  ,<tokenizer> TEXT DEFAULT ''
  ,<analyzer_params> TEXT DEFAULT ''
  ,<options> TEXT DEFAULT '']
)

Parâmetros

Parâmetro

Obrigatório

Descrição

search_data

Sim

A fonte de busca. Os tipos de dados suportados são TEXT, VARCHAR e CHAR. Este parâmetro deve ser uma coluna que possua um índice de texto completo. Caso contrário, um erro será retornado.

search_expression

Sim

O objeto de busca. Os tipos de dados suportados são TEXT, VARCHAR e CHAR. Este parâmetro deve ser uma constante.

mode

Não

O modo de busca. Os seguintes modos são suportados:

  • match (padrão): correspondência de palavra-chave. Cada token produzido pela tokenização é tratado como uma palavra-chave. O parâmetro operator define a relação entre as palavras-chave e tem como padrão OR.

  • phrase: busca por frase. O parâmetro slop em options configure a distância máxima entre as palavras em uma frase. O valor padrão é 0, o que significa que as palavras devem ser adjacentes. A busca por frase não suporta consultas aproximadas.

  • natural_language: busca em linguagem natural. Este modo suporta condições de consulta complexas, como lógica AND/OR, termos obrigatórios, termos excluídos e frases. Para mais informações, consulte Tantivy.

  • term: busca por termo. O search_expression não é tokenizado ou processado de outra forma. A função realiza uma correspondência exata no índice. A busca por termo não suporta consultas aproximadas.

  • fuzzy: busca aproximada. Realiza correspondência aproximada no search_expression com base na distância de edição. Suportado no Hologres V4.2 e posterior.

operator

Não

Especifique o operador lógico a ser usado entre palavras-chave. Este parâmetro tem efeito apenas quando mode está definido como match. Os seguintes valores são suportados:

  • OR (padrão): Se o objeto de busca contiver múltiplos tokens, a função retorna uma correspondência se qualquer token for encontrado.

  • AND: Se o objeto de busca contiver múltiplos tokens, a função retorna uma correspondência apenas se todos os tokens forem encontrados.

tokenizer, analyzer_params

Não

Especifique o tokenizador e sua configuração para o search_expression. Na maioria dos casos, não é necessário configurar esses parâmetros.

  • Se não especificado, a função usa o mesmo tokenizador e configuração do índice invertido de texto completo na coluna search_data. Se a fonte de busca for uma constante, o tokenizador padrão (jieba) é utilizado.

  • Se especificado, a função tokeniza o search_expression usando o tokenizador e a configuração definidos.

options

Não

Outros parâmetros para busca de texto completo. O formato para os parâmetros de entrada é 'key1=v1;key2=v2;....;keyN=vN;'. As seguintes opções são suportadas:

  • slop: tem efeito apenas quando mode é phrase. Pode ser 0 (padrão) ou um inteiro positivo e define a distância máxima permitida entre palavras em uma frase.

  • fuzziness: tem efeito apenas quando mode é match, natural_language ou fuzzy. Especifique a distância máxima de edição (o número total de inserções, exclusões ou substituições de caracteres) para correspondência aproximada. Os valores suportados são:

    • 0 (padrão): desativa a correspondência aproximada. A string de busca deve corresponder exatamente.

    • 1 ou 2: uma distância de edição de 1 ou 2 é permitida.

    • AUTO: a distância de edição é selecionada automaticamente com base no comprimento da string de busca. A regra padrão é: comprimento <3 → 0, comprimento 3–5 → 1, comprimento >5 → 2.

    • AUTO:<low>,<high>: personaliza os limites AUTO. Por exemplo, AUTO:3,5 significa: comprimento <3 → 0, comprimento 3–5 → 1, comprimento ≥6 → 2.

  • fuzzy_max_expansions: tem efeito apenas quando mode é match, natural_language ou fuzzy. Especifique o número máximo de termos candidatos gerados durante a correspondência aproximada. O valor padrão é 50. Um valor maior melhora o recall, mas aumenta a sobrecarga da consulta.

  • fuzzy_transpositions: tem efeito apenas quando mode é match, natural_language ou fuzzy. Especifique se uma transposição de dois caracteres adjacentes é tratada como uma única edição. O valor padrão é true.

  • minimum_should_match: tem efeito apenas quando mode é match ou natural_language. Especifique quantos dos tokens produzidos a partir do objeto de busca um documento deve conter para ser retornado. Esta opção filtra apenas o conjunto de resultados. Não afeta as pontuações BM25. Suportado no Hologres V5.0 e posterior. Os seguintes formatos são suportados:

    • Inteiro positivo: o número mínimo de tokens que devem corresponder. Por exemplo, 2 exige que pelo menos dois tokens correspondam.

    • Inteiro negativo: o número máximo de tokens que podem estar ausentes. Por exemplo, -1 permite que no máximo um token esteja ausente.

    • Porcentagem positiva: o número mínimo de tokens correspondentes, calculado como uma proporção da contagem de tokens e arredondado para baixo. Por exemplo, se o objeto de busca produzir cinco tokens, 75% exige que pelo menos floor(5 × 0,75) = 3 tokens correspondam.

    • Porcentagem negativa: o número máximo de tokens ausentes, calculado como uma proporção da contagem de tokens e arredondado para baixo. Por exemplo, se o objeto de busca produzir cinco tokens, -25% permite que no máximo floor(5 × 0,25) = 1 token esteja ausente, o que significa que pelo menos quatro tokens devem corresponder.

    • Especificação condicional: usa o formato token_count<spec. A especificação após a condição se aplica quando o número de tokens produzidos a partir do objeto de busca excede a contagem especificada. Por exemplo, 3<-25% exige que todos os tokens correspondam quando a contagem de tokens for 3 ou menos, e aplica -25% quando a contagem de tokens for maior que 3.

    • Múltiplas especificações condicionais: separe as condições com um único espaço. O Hologres aplica a primeira condição satisfeita. Por exemplo, 3<2 5<-1 exige que todos os tokens correspondam quando a contagem de tokens for 3 ou menos, aplica 2 quando a contagem de tokens for maior que 3 e 5 ou menos, e aplica -1 quando a contagem de tokens for maior que 5.

    • No modo natural_language, esta opção tem efeito apenas quando a string de consulta é analisada como uma consulta de combinação booleana. Se a string de consulta for analisada como uma consulta de frase, como "shandong university" entre aspas duplas, o Hologres ignora silenciosamente esta opção e realiza uma correspondência de frase.

    • Esta opção aplica-se apenas a consultas que possuem semântica should. Uma consulta não possui semântica should quando mode é match e operator é AND, ou quando mode é natural_language e cada elemento é restringido por um operador + ou -. Nesses casos, um valor de minimum_should_match maior que 0 retorna um conjunto de resultados vazio.

Nota

O parâmetro slop representa o intervalo máximo permitido (ou custo de transformação) entre as palavras em uma frase. Para tokenizadores como jieba, keyword e icu, a unidade de distância é o número de caracteres, não o número de tokens. Para tokenizadores como standard, simple e whitespace, a unidade é o número de tokens.

Valor de retorno

Retorna um valor FLOAT não negativo que representa a pontuação de relevância BM25 entre a fonte de busca e o objeto de busca. Uma pontuação mais alta indica maior relevância. A pontuação é 0 se o texto for completamente irrelevante.

Exemplos

  • Use o modo de correspondência de palavra-chave e altere o operador para AND.

    -- It is recommended to specify parameter names.
    SELECT TEXT_SEARCH (content, 'machine learning', operator => 'AND') FROM tbl;
    
    -- If you do not specify parameter names, you must provide them in the correct order.
    SELECT TEXT_SEARCH (content, 'machine learning', 'match', 'AND') FROM tbl;
  • Use o modo de busca por frase e defina slop como 2.

    SELECT TEXT_SEARCH (content, 'machine learning', 'phrase', options => 'slop=2;') FROM tbl;
  • Use o modo de busca em linguagem natural.

    -- Use the AND and OR operators to define search logic for the tokens.
    SELECT TEXT_SEARCH (content, 'machine AND (system OR recognition)', 'natural_language') FROM tbl;
    
     -- Use + (required term) and - (excluded term) to define search logic for the tokens.
    SELECT TEXT_SEARCH (content, '+learning -machine system', 'natural_language') FROM tbl;
  • Use o modo de busca por termo.

    SELECT TEXT_SEARCH (content, 'machine learning', 'term') FROM tbl;
  • Use o modo de busca aproximada com fuzziness definido como 1.

    SELECT TEXT_SEARCH (content, 'machine learning', 'fuzzy', options => 'fuzziness=1;') FROM tbl;

Função TOKENIZE

A função TOKENIZE retorna os resultados da tokenização com base na configuração do tokenizador. Use esta função para depurar a tokenização de um índice invertido de texto completo.

Sintaxe da função

TOKENIZE (
  <search_data> TEXT
  [ ,<tokenizer> TEXT DEFAULT ''
  ,<analyzer_params> TEXT DEFAULT '']
)

Parâmetros

  • search_data: Obrigatório. O texto alvo a ser tokenizado. Este parâmetro deve ser uma constante.

  • tokenizer, analyzer_params: Opcional. Especifique o tokenizador e sua configuração para o texto search_data. O tokenizador padrão é jieba na V4.1 e anteriores, e ik na V4.2 e posteriores.

Valor de retorno

Retorna um array TEXT contendo os tokens do texto alvo.

Verifique uso do índice

Verifique o plano de execução para ver se uma consulta SQL usa o índice invertido de texto completo. A presença de Fulltext Filter no plano indica que o índice foi usado com sucesso. Para mais informações sobre planos de execução, consulte EXPLAIN and EXPLAIN ANALYZE.

SQL de exemplo:

EXPLAIN ANALYZE SELECT * FROM wiki_articles WHERE text_search(content, 'Yangtze River') > 0;

O plano de execução é mostrado a seguir. Ele contém o campo Fulltext Filter, que indica que a instrução SQL utilizou com sucesso o índice invertido de texto completo.

QUERY PLAN
Gather  (cost=0.00..1.00 rows=1 width=12)
  ->  Local Gather  (cost=0.00..1.00 rows=1 width=12)
        ->  Index Scan using Clustering_index on wiki_articles  (cost=0.00..1.00 rows=1 width=12)
              Fulltext Filter: (text_search(content, search_expression => 'Yangtze River'::text, mode => match, operator => OR, tokenizer => jieba, analyzer_params => {"filter":["removepunct","lowercase",{"stop_words":["_english_"],"type":"stop"},{"language":"english","type":"stemmer"}],"tokenizer":{"hmm":true,"mode":"search","type":"jieba"}}, options => ) > '0'::double precision)
Query Queue: init_warehouse.default_queue
Optimizer: HQO version 4.0.0

Recomendações

Reconstruir índices usando recursos Serverless

Algumas alterações de propriedade acionam compactação e reconstrução de índice, o que pode causar picos de uso de CPU. Trate essas alterações da seguinte forma:

Alterações em bitmap_columns, dictionary_encoding_columns ou índices vetoriais

Use a sintaxe REBUILD com recursos de Computação Serverless em vez de ALTER TABLE ... SET. Para mais informações, consulte REBUILD.

ASYNC REBUILD TABLE <table_name>
WITH (
    rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
    bitmap_columns = '<col1>,<col2>',
    dictionary_encoding_columns = '<col1>:on,<col2>:off',
    vectors = '{
    "<col_vector>": {
        "algorithm": "HGraph",
        "distance_method": "Cosine",
        "builder_params": {
            "base_quantization_type": "rabitq",
            "graph_storage_type": "compressed",
            "max_degree": 64,
            "ef_construction": 400,
            "precise_quantization_type": "fp32",
            "use_reorder": true,
            "max_total_size_to_merge_mb": 4096
        }
    }
    }'
);

Alterações no armazenamento colunar para dados JSON ou colunas de índice de texto completo

A sintaxe REBUILD ainda não é suportada para essas alterações. Use uma tabela temporária em vez disso:

BEGIN;
-- Clean up any existing temporary table
DROP TABLE IF EXISTS <table_new>;
-- Create a temporary table with the same structure
SET hg_experimental_enable_create_table_like_properties = on;
CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
COMMIT;

-- Apply the new column properties to the temporary table
ALTER TABLE <table_new> ALTER COLUMN <column_name> SET (enable_columnar_type = ON);
CREATE INDEX <idx_name> ON <table_new> USING FULLTEXT (column_name);

-- Insert data using Serverless resources (index building completes synchronously)
SET hg_computing_resource = 'serverless';
INSERT INTO <table_new> SELECT * FROM <table>;
ANALYZE <table_new>;

BEGIN;
-- Replace the original table with the temporary table
DROP TABLE IF EXISTS <table>;
ALTER TABLE <table_new> RENAME TO <table>;
COMMIT;

Outras alterações de propriedade (por exemplo, distribution_key, clustering_key, segment_key, formato de armazenamento)

Use a sintaxe REBUILD com recursos de Computação Serverless.

Operações avançadas: Personalizar configurações de tokenizador

O Hologres recomenda o uso da configuração padrão do tokenizador. No entanto, se a configuração padrão para um índice invertido de texto completo não atender às suas necessidades, personalize o tokenizador para uma tokenização mais flexível.

Requisitos de analyzer_params

O parâmetro analyzer_params deve atender aos seguintes requisitos:

  • Deve ser uma string JSON.

  • O objeto JSON de nível superior suporta duas chaves: tokenizer e filter. Elas são configuradas da seguinte forma:

    • filter: Opcional. Um array JSON usado para configurar filtros. Múltiplos filtros são aplicados na ordem especificada.

    • tokenizer: Obrigatório. Um objeto JSON que configura as propriedades do tokenizador. Este objeto JSON suporta as seguintes chaves:

      • type: Obrigatório. O nome do tokenizador.

      • Os parâmetros para o objeto tokenizer variam conforme o tokenizador. Para detalhes, consulte a tabela a seguir:

        Tokenizador

        Parâmetro




        Descrição

        Valor

        jieba

        mode

        O modo de tokenização.

        • search (padrão): Lista múltiplas combinações possíveis de tokens, permitindo redundância.

        • exact: Não realiza divisão redundante.

        hmm

        Determina se deve usar um Modelo Oculto de Markov para identificar palavras que não estão no dicionário. Este recurso melhora a identificação de novas palavras.

        • true (padrão): Usa o modelo.

        • false: Não usa o modelo.

        standard

        max_token_length

        O comprimento máximo do token.

        Um inteiro positivo. O valor padrão é 255. Se um token exceder esse comprimento, ele será dividido em intervalos de max_token_length.

        ik

        mode

        O modo de tokenização.

        • ik_max_word (padrão): Tokenização de granularidade fina que gera todas as palavras curtas possíveis.

        • ik_smart: Um modo de tokenização de granularidade grossa que prioriza palavras mais longas para reduzir o número de tokens. Os tokens de saída não se sobrepõem. Este modo tenta combinar numerais e palavras de medida em um único token.

        enable_lowercase

        Determina se deve converter tokens para minúsculas.

        • true (padrão)

        • false

        ngram

        min_ngram

        O comprimento mínimo de caracteres de um token.

        Um número positivo. O padrão é 1. A diferença máxima permitida em relação a max_ngram é 3.

        Nota: Você pode ajustar a diferença máxima definindo o seguinte GUC, por exemplo, SET hg_fulltext_index_max_ngram_diff = 5;

        max_ngram

        O comprimento máximo de caracteres de um token.

        Um número positivo. O padrão é 2. O valor deve estar no intervalo [1, 255]. A diferença máxima permitida em relação a min_ngram é 3.

        Nota

        Uma grande diferença entre max_ngram e min_ngram faz com que o tokenizador ngram gere muitos tokens, aumentando o consumo de recursos, armazenamento e tempo de construção do índice.

        prefix_only

        Determina se deve gerar apenas n-grams de prefixo.

        • true

        • false (padrão)

        pinyin

        keep_first_letter

        Determina se deve manter a primeira letra de cada caractere chinês.

        • true (padrão): Mantém as iniciais do pinyin.

        • false: Não mantém a primeira letra.

        keep_separate_first_letter

        Determina se deve manter a primeira letra de cada caractere chinês como um token separado.

        • true: Mantém a inicial de cada caractere.

        • false (padrão): Não mantém como tokens separados.

        limit_first_letter_length

        O comprimento máximo do token que contém as primeiras letras combinadas.

        Um inteiro. O valor padrão é 16.

        keep_full_pinyin

        Determina se deve manter o Pinyin completo de cada caractere chinês.

        • true (padrão): O pinyin é mantido.

        • false: Não mantém o Pinyin completo.

        keep_joined_full_pinyin

        Determina se deve unir o Pinyin completo de cada caractere chinês em um único token.

        • true: Habilita a concatenação.

        • false (padrão): Não une o Pinyin.

        keep_none_chinese

        Determina se deve manter letras ou números não chineses no resultado.

        • true (padrão): Mantém-os.

        • false: Não os mantém.

        keep_none_chinese_together

        Determina se deve manter letras ou números não chineses consecutivos juntos como um único token.

        • true (padrão): Mantém sequências de letras e dígitos juntas.

        • false: Não preserva a forma original.

        Nota

        Este parâmetro tem efeito apenas quando keep_none_chinese está definido como true.

        keep_none_chinese_in_first_letter

        Determina se deve manter letras ou números não chineses no token de primeira letra.

        • true (padrão): Mantém o token.

        • false: Não os mantém.

        keep_none_chinese_in_joined_full_pinyin

        Determina se deve manter letras ou números não chineses no token de Pinyin completo unido.

        • true: Mantém o token.

        • false (padrão): Não os mantém.

        none_chinese_pinyin_tokenize

        Determina se deve dividir letras não chinesas em termos Pinyin separados, caso formem um Pinyin válido.

        • true (padrão): Divide-os.

        • false: Não os divide.

        Nota

        Este parâmetro tem efeito apenas quando keep_none_chinese e keep_none_chinese_together estão definidos como true.

        keep_original

        Determina se deve manter a entrada original.

        • true: Mantém a entrada original.

        • false (padrão): Não mantém a entrada original.

        lowercase

        Determina se deve converter letras não chinesas para minúsculas.

        • true (padrão)

        • false

        trim_whitespace

        Determina se deve remover caracteres de espaço em branco.

        • true (padrão)

        • false

        remove_duplicated_term

        Determina se deve remover termos duplicados.

        • true: Remove stop words.

        • false (padrão): Não remove duplicatas.

        keep_separate_chinese

        Determina se deve manter caracteres chineses individuais como tokens separados.

        • true: Mantém os caracteres.

        • false (padrão): Não os mantém.

analyzer_params padrão

A tabela a seguir mostra a configuração padrão de analyzer_params para diferentes tokenizadores.

Tokenizador

Padrão analyzer_params

jieba (tokenizador padrão na V4.1 e anteriores)

{
  "tokenizer": {
    "type": "jieba", 
    "mode": "search",
    "hmm": true
  }, 
  "filter": [
    "removepunct",
    "lowercase",
    {"type": "stop", "stop_words": ["_english_"]},
    {"type": "stemmer", "language": "english"}
  ]
}

whitespace

{
  "tokenizer": {
    "type": "whitespace"
  }
}

keyword

{
  "tokenizer": {
    "type": "keyword"
  }
}

simple

{
  "tokenizer": {
    "type": "simple"
  }, 
  "filter": [
    "lowercase"
  ]
}

standard

{
  "tokenizer": {
    "type": "standard",
    "max_token_length": 255
  }, 
  "filter": [
    "lowercase"
  ]
}

icu

{
  "tokenizer": {
    "type": "icu"
  }, 
  "filter": [
    "removepunct",
    "lowercase"
  ]
}

ik (tokenizador padrão na V4.2 e posteriores)

{
  "tokenizer": {
    "type": "ik",
    "mode": "ik_max_word",
    "enable_lowercase": true
  },
  "filter": [
    {"type": "stop", "stop_words": ["_english_"]},
    {"type": "stemmer", "language": "english"}
  ]
}

ngram

{
  "tokenizer": {
    "type": "ngram",
    "min_gram": 1,
    "max_gram": 2,
    "prefix_only": false
  }
}

pinyin

{
  "tokenizer": {
    "type": "pinyin",
    "keep_first_letter": true,
    "keep_separate_first_letter": false,
    "keep_full_pinyin": true,
    "keep_joined_full_pinyin": false,
    "keep_none_chinese": true,
    "keep_none_chinese_together": true,
    "none_chinese_pinyin_tokenize": true,
    "keep_original": false,
    "limit_first_letter_length": 16,
    "lowercase": true,
    "trim_whitespace": true,
    "keep_none_chinese_in_first_letter": true,
    "keep_none_chinese_in_joined_full_pinyin": false,
    "remove_duplicated_term": false,
    "ignore_pinyin_offset": true,
    "fixed_pinyin_offset": false,
    "keep_separate_chinese": false
  }
}

Configure filter

O Hologres suporta os seguintes filtros em analyzer_params.

Nota

Múltiplos filtros são aplicados na ordem especificada.

Filtro

Descrição

Formato do parâmetro

Exemplo de uso

lowercase

Converte letras maiúsculas em um token para minúsculas.

Use o nome do filtro como uma string.

"lowercase"
  • Definição do filtro

    "filter": ["lowercase"]
  • Resultado do filtro

    ["Hello", "WORLD"] -> ["hello", "world"]

stop

Remove tokens de stop words.


stop_words: Uma lista de stop words. A lista deve conter apenas strings. Você pode fornecer uma lista personalizada ou usar um dos seguintes dicionários integrados para idiomas específicos:

"_english_"
    "_danish_"
    "_dutch_"
    "_finnish_"
    "_french_"
    "_german_"
    "_hungarian_"
    "_italian_"
    "_norwegian_"
    "_portuguese_"
    "_russian_"
    "_spanish_"
    "_swedish_"
  • Definição do filtro

    "filter": [{
      "type": "stop",
      "stop_words": ["_english_", "cat"]
    }]
  • Resultado do filtro

    ["the", "cat", "is", "on", "a", "mat"] -> ["mat"]

    Nota

    A palavra "cat" é uma stop word personalizada; "the", "is", "on" e "a" são do dicionário integrado _english_.

stemmer

Reduz tokens à sua forma raiz (radical) com base nas regras gramaticais de um idioma especificado.

language: O idioma. Os seguintes idiomas integrados são suportados.

"arabic",
    "danish",
    "dutch",
    "english",
    "finnish",
    "french",
    "german",
    "greek",
    "hungarian",
    "italian",
    "norwegian",
    "portuguese",
    "romanian",
    "russian",
    "spanish",
    "swedish",
    "tamil",
    "turkish"
  • Definição do filtro

    "filter": [{
      "type": "stemmer",
      "language": "english"
    }]
  • Resultado do filtro

    ["machine", "learning"] -> ["machin", "learn"]

length

Remove tokens que excedem um comprimento especificado.

max: O comprimento máximo. O valor deve ser um inteiro positivo.

{"type": "length", "max": 10}
  • Definição do filtro

    "filter": [{"type": "length", "max": 10}]
  • Resultado do filtro

    ["AI", "for", "Artificial", "Intelligence"] -> ["AI", "for", "Artificial"]

removepunct

Remove tokens que consistem apenas em caracteres de pontuação.

Use o nome do filtro como uma string.

"removepunct"
Nota

A partir da V4.0.8, removepunct suporta o parâmetro mode, que define o modo de remoção. Os valores válidos são:

  • if_all (padrão): Remove um token apenas se todos os seus caracteres forem pontuação.

  • if_any: Remove um token se ele contiver qualquer caractere de pontuação.

  • Definição do filtro

    "filter": ["removepunct"]
    Nota

    Isso equivale a "filter": [{"type": "removepunct", "mode": "if_all"}].

  • Resultado do filtro

    ["Chinese", "english", "Chinese.", "english.", "124", "124!=8", ".", ",", ",,", " ..."]->["Chinese", "english", "Chinese.", "english.", "124", "124!=8"]

    "filter": [{"type": "removepunct", "mode": "if_any"}]

    ["Chinese", "english", "Chinese.", "english.", "124", "124!=8", ".", ",", ",,", " ..."] -> ["Chinese", "english", "124"]

pinyin

Fornece filtragem de tokens específica para Pinyin.

{
  "type": "pinyin",
  "keep_first_letter": true,
  "keep_separate_first_letter": false,
  "keep_full_pinyin": true,
  "keep_joined_full_pinyin": false,
  "keep_none_chinese": true,
  "keep_none_chinese_together": true,
  "none_chinese_pinyin_tokenize": true,
  "keep_original": false,
  "limit_first_letter_length": 16,
  "lowercase": true,
  "trim_whitespace": true,
  "keep_none_chinese_in_first_letter": true,
  "keep_none_chinese_in_joined_full_pinyin": false,
  "remove_duplicated_term": false,
  "ignore_pinyin_offset": true,
  "fixed_pinyin_offset": false,
  "keep_separate_chinese": false
}

Usa as mesmas propriedades do tokenizador Pinyin.