A extensão RUM adiciona informações de posição e timestamp aos índices de busca de texto completo do PostgreSQL. Isso elimina as varreduras extras no heap que tornam lentas a classificação, a busca por frases e a ordenação baseada em timestamp.
Pré-requisitos
Antes de começar, verifique se:
A instância RDS executa o PostgreSQL 10 ou superior
Caso a instância execute o PostgreSQL 14 ou PostgreSQL 15, a versão secundária do mecanismo deve ser 20221030 ou posterior. Para mais informações, consulte Atualize a versão secundária do mecanismo de uma instância ApsaraDB RDS for PostgreSQL
Limitações do GIN e soluções do RUM
O Generalized Inverted Index (GIN) oferece suporte à busca de texto completo com os tipos tsvector e tsquery, mas não armazena informações de posição ou timestamp em seus índices. Esse comportamento gera três problemas de desempenho:
|
Limitação do GIN |
Impacto |
|
Posições das palavras não armazenadas |
A classificação exige uma varredura extra no heap após a varredura do índice para recuperar as posições dos lexemas |
|
Posições das palavras não armazenadas |
A busca por frases requer uma varredura adicional no heap para validar os limites da frase |
|
Informações de timestamp não armazenadas |
A ordenação por timestamp demanda uma varredura extra no heap, pois índices com morfemas não guardam esses dados |
O RUM resolve todos esses pontos ao armazenar as posições das palavras e as informações de timestamp diretamente no índice. Dessa forma, não é necessária nenhuma varredura extra no heap para classificação, busca por frases ou ordenação por timestamp.
Os índices RUM demoram mais para serem criados e preenchidos do que os índices GIN. O RUM gera índices com base em write-ahead logging (WAL) e armazena mais informações por entrada em comparação ao GIN.
Ative ou desative a extensão
Ative a extensão:
CREATE EXTENSION rum;
Desative a extensão:
DROP EXTENSION rum;
Operadores
A extensão RUM fornece os seguintes operadores:
|
Operador |
Retorno |
Descrição |
|
|
|
float4 |
Retorna a distância entre um valor |
|
|
|
float8 |
Calcula a distância entre dois timestamps. |
|
|
|
timestamp` |
float8 |
Fornece a distância apenas para o timestamp à esquerda. |
|
|
=> timestamp` |
float8 |
Indica a distância apenas para o timestamp à direita. |
Os três últimos operadores também funcionam com estes tipos: timestamptz, int2, int4, int8, float4, float8, money e oid.
Referências
A extensão RUM segue o mesmo método de uso da versão open source. Para obter a referência completa de funções e exemplos adicionais, consulte a documentação da extensão RUM.