As versões 4.0 e posteriores do Hologres oferecem suporte a um índice invertido de texto completo. Esse recurso é baseado no mecanismo de busca de texto completo de alto desempenho Tantivy. Ele também oferece suporte ao 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 de origem no Hologres, ele 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 tokenizer divide o texto em tokens. O índice então registra o mapeamento de cada token para seu texto de origem, junto com sua posição e frequência do termo.
Ao realizar uma busca de texto completo, o Hologres primeiro tokeniza o texto da consulta em um conjunto de tokens de consulta. Em seguida, o Hologres usa o algoritmo BM25 para calcular uma pontuação de relevância para cada texto de origem em relação ao conjunto de tokens de consulta. Esse processo permite uma busca de texto completo de alto desempenho e alta precisão.
Considerações
No Hologres V4.0 e versões posteriores, os índices invertidos de texto completo são suportados apenas em tabelas com armazenamento colunar e armazenamento híbrido linha-coluna, não sendo suportados em tabelas com armazenamento por linha.
Você pode criar um índice invertido de texto completo apenas em colunas TEXT, CHAR ou VARCHAR.
Você pode criar apenas um índice invertido de texto completo por coluna. Para indexar várias colunas, crie um índice separado para cada uma.
Após criar um índice invertido de texto completo, os arquivos de índice para dados existentes e recém-carregados em lote são construídos de forma assíncrona durante a compactação de dados. Até que o índice seja construído, 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 são construídos de forma síncrona. 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. Você pode consultar dados usando o índice somente após a conclusão de uma atualização.
Você pode realizar uma busca de texto completo apenas em colunas que possuem um índice invertido de texto completo. A busca em colunas sem índice não é suportada.
Recomendamos o uso de recursos Serverless para importação de dados em lote. Esses recursos realizam a compactação e constroem o índice invertido de texto completo de forma síncrona durante o processo de importação. Para mais informações, consulte Usar o Serverless Computing para executar tarefas de leitura e gravação e Usar o Serverless Computing para executar tarefas de compactação. Se você não usar recursos Serverless, recomendamos acionar manualmente a compactação após uma importação em lote ou uma modificação de índice com o seguinte comando.
VACUUM <schema_name>.<table_name>;O algoritmo de busca BM25 calcula as pontuações de relevância no nível do arquivo. Se você importar dados em lotes pequenos, recomendamos acionar manualmente a compactação conforme necessário para mesclar arquivos de dados e melhorar a precisão da busca.
Você pode usar recursos Serverless para executar consultas de busca de texto completo.
Use a tabela a seguir para escolher o tokenizer adequado ao seu cenário:
Cenário
Tokenizer
Descrição
Extração de palavras-chave de artigos longos
Jieba
Oferece suporte à descoberta de novas palavras e à alternância de modos complexos.
Busca em texto descritivo em chinês
IK
Identifica termos em chinês com precisão.
Busca em texto semelhante a títulos em inglês
Simple, Whitespace, Standard
Simples e eficiente. Escolha um com base no seu texto específico.
Busca fuzzy em texto semelhante a logs
Ngram
Sem dicionário e adequado para consultas de texto fuzzy.
Busca baseada em Pinyin para nomes de produtos ou pessoas em chinês
Pinyin
Oferece suporte a diversos cenários de busca por Pinyin em chinês, incluindo Pinyin completo, abreviações de primeira letra e caracteres com múltiplas pronúncias.
Gerenciar índices
Criar 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 | Especifica os parâmetros para o índice invertido de texto completo. Os seguintes parâmetros são suportados:
Nota Cada índice suporta apenas um |
Configuração de index_options
O parâmetro index_options suporta três níveis. As 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 and 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 requerem pontuação e classificação com base na frequência do termo, mas não precisam de correspondência exata de frase. |
docs | Apenas ID do documento |
| Ideal para cenários sensíveis ao armazenamento que requerem apenas verificações de existência (filtragem) e não precisam de pontuação de relevância. |
Para índices que usam o tokenizer keyword, o nível de registro é fixo como docs, e a configuração index_options não se aplica.
Exemplos
Crie um índice invertido de texto completo com o tokenizer e a configuração padrão (o tokenizer
jieba).CREATE INDEX idx1 ON tbl USING FULLTEXT (col1);Especifique explicitamente o tokenizer
ike use sua configuração padrão.CREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (tokenizer = 'ik');Especifique explicitamente uma configuração personalizada de tokenizer: o tokenizer
jiebano modoexactcom apenas o filtrolowercaseCREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (tokenizer = 'jieba', analyzer_params = '{"tokenizer":{"type":"jieba","mode":"exact"}, "filter":["lowercase"]}');Defina
index_optionscomofreqsao criar o índice. Isso economiza espaço, mas não suporta consultas de frase. Suportado a partir do Hologres V4.1.9.CREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (index_options = 'freqs');
Após criar um índice invertido de texto completo, a compactação constrói os arquivos de índice após a importação de dados.
Recomendamos o uso de 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 de forma síncrona durante a importação de dados. Para mais informações, consulte Usar computação serverless para executar tarefas de leitura e gravação e Usar computação serverless para executar tarefas de compactação.
Se você não usar 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 Compactação (Beta)
VACUUM <schema_name>.<table_name>;
Alterar 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 Parâmetros.
Exemplos
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 tokenizer do índice para
standardALTER INDEX idx1 SET (tokenizer = 'standard');Altere o tokenizer do índice para
ikinik_max_wordALTER INDEX idx1 SET ( tokenizer = 'ik', analyzer_params = '{"tokenizer":{"type":"ik","mode":"ik_max_word","enable_lowercase": false}}' );Redefina para o tokenizer padrão
jiebae use sua configuração padrão deanalyzer_params.ALTER INDEX idx1 RESET (tokenizer); ALTER INDEX idx1 RESET (tokenizer, analyzer_params);Redefina para a configuração padrão de
analyzer_paramsdo tokenizer atual.ALTER INDEX idx1 RESET (analyzer_params);Altere o
index_optionsdo índice paradocs.ALTER INDEX idx1 SET (index_options = 'docs');Redefina o
index_optionspara 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 Parâmetros.
Visualizar índices
O Hologres fornece a tabela do sistema hologres.hg_index_properties
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 campotable_namespaceSELECT * FROM hologres.hg_index_properties;
indexname: O nome real do índice.
Visualizar o progresso de construção do índice
Após criar um índice invertido de texto completo, você pode usar a função integrada hg_show_build_index_progress
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 número total de arquivos, o progresso de construção em porcentagem e o tempo restante estimado.
Valores de retorno
O resultado inclui os seguintes campos:
Campo | Tipo de dados | 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 de construção, em porcentagem. |
estimated_remaining_time | TEXT | O tempo restante estimado de construção. |
Busca de texto completo usando um índice
O Hologres suporta uma variedade de modos de busca, permitindo que você adapte as buscas de texto completo à sua lógica de negócios.
Modo de busca | Descrição |
Correspondência de palavras-chave | Busca palavras-chave em um objeto de busca tokenizado. Você pode definir a relação entre palavras-chave usando a lógica AND/OR. |
Busca por frase | Busca uma frase completa. Uma correspondência requer 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. Isso inclui a 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 cadeia 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 origem 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 origem da busca. Os tipos de dados suportados são |
search_expression | Sim | O objeto de busca. Os tipos de dados suportados são |
mode | Não | O modo de busca. Os seguintes modos são suportados:
|
operator | Não | Especifica o operador lógico a ser usado entre palavras-chave. Esse parâmetro tem efeito apenas quando mode é definido como
|
tokenizer, analyzer_params | Não | Especifica o tokenizer e sua configuração para o search_expression. Na maioria dos casos, você não precisa configurar esses parâmetros.
|
options | Não | Outros parâmetros para busca de texto completo. O formato dos parâmetros de entrada é
Nota O parâmetro slop representa o intervalo máximo permitido (ou custo de transformação) entre as palavras em uma frase. Para tokenizers como |
Valor de retorno
Retorna um valor FLOAT
Exemplos
Use o modo de correspondência de palavras-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
slopcomo 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 fuzzy com
fuzzinessdefinido 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 tokenizer. Você pode usar essa 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 de destino a ser tokenizado. Esse parâmetro deve ser uma constante.
tokenizer, analyzer_params: Opcional. Especifica o tokenizer e sua configuração para o texto search_data. O tokenizer padrão é
jieba.
Valor de retorno
Retorna um array TEXT
Verificar o uso do índice
Você pode verificar 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 e EXPLAIN ANALYZE.
SQL de exemplo:
EXPLAIN ANALYZE SELECT * FROM wiki_articles WHERE text_search(content, 'Yangtze River') > 0;O plano de execução é o seguinte. Ele contém o campo Fulltext Filter
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.0Recommendations
Rebuild indexes using Serverless resources
Some property changes trigger compaction and index rebuilding, which can spike CPU usage. Handle these changes as follows:
Changes to `bitmap_columns`, `dictionary_encoding_columns`, or vector indexes
Use a sintaxe REBUILD com recursos do Serverless Computing em vez de ALTER TABLE ... SET. For more information, see 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;Other property changes (e.g., `distribution_key`, `clustering_key`, `segment_key`, storage format)
Use the REBUILD syntax with Serverless Computing resources.
Operações avançadas: Personalizar configurações de tokenizer
O Hologres recomenda o uso da configuração padrão do tokenizer. No entanto, se a configuração padrão de um índice invertido de texto completo não atender às suas necessidades, você pode personalizar o tokenizer para uma tokenização mais flexível.
Requisitos de analyzer_params
O parâmetro analyzer_params deve atender aos seguintes requisitos:
Deve ser uma cadeia de caracteres JSON.
O objeto JSON de nível superior suporta duas chaves:
tokenizerandfilter. 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 tokenizer. Este objeto JSON suporta as seguintes chaves:type: Obrigatório. O nome do tokenizer.Os parâmetros do objeto
tokenizervariam conforme o tokenizer. Para detalhes, consulte a tabela a seguir:Tokenizer
Parameter
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. Esse 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. Esse modo tenta combinar numerais e palavras de medida em um único token.
enable_lowercase
Determina se deve converter tokens para minúsculas.
true(default)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_ngramis 3.NotaA large difference between
max_ngramandmin_ngramcauses the ngram tokenizer to generate many tokens, increasing resource consumption, storage, e index build time.prefix_only
Determina se deve gerar apenas n-gramas de prefixo.
truefalse(default)
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: Ativa 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.false: Não 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 as sequências de letras e dígitos juntas.false: Não preserva a forma original.
NotaEsse parâmetro tem efeito apenas quando
keep_none_chineseestá definido comotruekeep_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 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 mantém.
none_chinese_pinyin_tokenize
Determina se deve dividir letras não chinesas em termos Pinyin separados, caso formem Pinyin válido.
true(padrão): Divide.false: Não divide.
NotaEsse parâmetro tem efeito apenas quando
keep_none_chineseandkeep_none_chinese_togetherare set totruekeep_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(default)false
trim_whitespace
Determina se deve remover caracteres de espaço em branco.
true(default)false
remove_duplicated_term
Determina se deve remover termos duplicados.
true: Remove termos duplicados.false(padrão): Não remove duplicados.
keep_separate_chinese
Determina se deve manter caracteres chineses individuais como tokens separados.
true: Mantém os caracteres.
false(padrão): Não mantém.
analyzer_params padrão
A tabela a seguir mostra a configuração padrão de analyzer_params
Tokenizer | Padrão |
jieba (tokenizer padrão) | |
whitespace | |
keyword | |
simple | |
standard | |
icu | |
ik | |
ngram | |
pinyin | |
Configuração de filter
O Hologres suporta os seguintes filtros em analyzer_params.
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 cadeia de caracteres. |
|
stop | Remove tokens de palavras de parada (stop words). |
|
|
stemmer | Reduz tokens à sua forma raiz (radical) com base nas regras gramaticais de um idioma especificado. |
|
|
length | Remove tokens que excedem um comprimento especificado. |
|
|
removepunct | Remove tokens que consistem apenas em caracteres de pontuação. | Use o nome do filtro como uma cadeia de caracteres. Nota A partir da V4.0.8, o
|
|
pinyin | Fornece filtragem de tokens específica para Pinyin. | | Usa as mesmas propriedades do tokenizer Pinyin. |