Los índices de RUM en AlloyDB para PostgreSQL te permiten acelerar las consultas de búsqueda en el texto completo almacenando
información posicional y de atributos junto con los lexemas en el índice.
Puedes habilitar la extensión rum para crear índices de RUM y optimizar la clasificación de relevancia,
las búsquedas de frases y el ordenamiento basado en marcas de tiempo.
Antes de comenzar
Para crear la extensión de RUM, debes tener el rol de base de datos alloydbsuperuser.
El rol de Identity and Access Management (IAM) de administrador de AlloyDB (roles/alloydb.admin)
otorga control total sobre los recursos de AlloyDB, pero no otorga el rol de base de datos alloydbsuperuser. Para crear la
extensión, un administrador debe otorgarte de forma explícita el rol de base de datos alloydbsuperuser.
Para obtener más información sobre cómo otorgar roles, consulta Agrega un usuario o una cuenta de servicio de IAM a un clúster.
Crea la extensión de RUM
Debes crear la extensión de RUM una vez por base de datos.
- Conéctate a tu base de datos de AlloyDB con
psqlo con otro cliente. Para obtener más información, consulta Conéctate a una instancia de clúster. Ejecuta el siguiente comando de SQL para crear la extensión:
CREATE EXTENSION IF NOT EXISTS rum;
Crea un índice de RUM
Para optimizar las consultas de búsqueda en el texto completo, crea un índice de RUM en tus datos. RUM ofrece varias clases de operadores para diferentes casos de uso.
Tipos de clases de operadores de RUM
En la siguiente tabla, se resumen las diferentes clases de operadores de RUM y sus casos de uso principales.
| Clase de operador | Caso de uso principal | Limitaciones |
|---|---|---|
rum_tsvector_ops |
Búsqueda estándar en el texto completo con clasificación y búsqueda de frases. | N/A |
rum_tsvector_hash_ops |
Índice más pequeño y actualizaciones más rápidas para la búsqueda en el texto completo. | No admite la búsqueda de prefijos. |
rum_tsvector_addon_ops |
Búsqueda en el texto completo ordenada por otra columna | N/A |
rum_anyarray_ops |
Búsqueda en columnas de arrays | N/A |
rum_<TYPE>_ops |
Indexar tipos escalares para consultas basadas en la distancia | N/A |
rum_tsvector_hash_addon_ops |
Búsqueda en el texto completo basada en hash ordenada por otra columna. | No admite la coincidencia de prefijos. |
rum_tsquery_ops |
Indexa los valores de tsquery almacenados para la búsqueda inversa. |
N/A |
rum_anyarray_addon_ops |
Búsqueda de arrays ordenada por otra columna. | N/A |
Indexa para la búsqueda básica en el texto completo
Usa la clase de operador rum_tsvector_ops para la búsqueda de texto estándar que requiere
capacidades de clasificación rápida y búsqueda de frases. Esta clase de operador almacena la
posición de cada lexema en el índice. En el siguiente ejemplo, se crea una tabla llamada documents con una columna content.
Crea una tabla llamada
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL, published_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() );Completa la tabla
documentscon datos de muestra:INSERT INTO documents (title, content) VALUES ('Title', 'This search engine is working as intended');Agrega una columna
tsvectorgenerada a tu tabla. Esta columna almacena automáticamente el texto procesado y mejora el rendimiento de las consultas:ALTER TABLE documents ADD COLUMN search_vector tsvector GENERATED ALWAYS AS (to_tsvector('english', content)) STORED;Crea el índice de RUM en la nueva columna
search_vector:CREATE INDEX idx_docs_rum ON documents USING rum (search_vector rum_tsvector_ops);Consulta la tabla con el índice. El operador
<=>calcula la puntuación de relevancia, o distancia, entre el documento y la consulta directamente desde el índice, lo que permite una clasificación rápida:SELECT title, content FROM documents WHERE search_vector @@ to_tsquery('english', 'search <-> engine') ORDER BY search_vector <=> to_tsquery('english', 'search <-> engine');Completa la tabla
documentscon más datos:INSERT INTO documents (title, content) VALUES ('Title1', 'English is my primary language.'); INSERT INTO documents (title, content) VALUES ('Title2', 'Google has a great engineering culture');Ejecuta una búsqueda con prefijo. Esto busca documentos que contengan palabras que comiencen con
eng, comoengineeroenglish:SELECT title, content FROM documents WHERE search_vector @@ to_tsquery('english', 'eng:*');
Índice para la búsqueda de hash optimizada
Usa la clase de operador rum_tsvector_hash_ops para reducir el tamaño del índice y mejorar
las velocidades de actualización. Esta clase almacena un hash de cada lexema en lugar del lexema
completo. Este enfoque genera un índice más pequeño, pero no admite la búsqueda de prefijos. En el siguiente ejemplo, se supone que tienes una tabla llamada documents
con una columna search_vector.
Crea el índice de RUM con la clase de operador hash:
CREATE INDEX idx_docs_rum_hash ON documents USING rum (search_vector rum_tsvector_hash_ops);Completa la tabla
documentscon más datos:INSERT INTO documents (title, content) VALUES ('Title3', 'That person was driving incredibly fast, however the routing was not very efficient');Ejecuta una consulta de coincidencia estándar:
SELECT * FROM documents WHERE search_vector @@ to_tsquery('english', 'fast & efficient');
Índice para la búsqueda ordenada por marca de tiempo
Usa la clase de operador rum_tsvector_addon_ops para optimizar las consultas que filtran
por texto y ordenan por otro campo, como una marca de tiempo. Este patrón almacena el valor del campo adicional directamente en el índice, lo que evita una operación de ordenamiento lenta después de la búsqueda. En el siguiente ejemplo, se supone que tienes una tabla
llamada documents con una columna search_vector y una columna published_at.
Crea un índice que incluya la marca de tiempo
published_at:CREATE INDEX idx_docs_rum_timestamp ON documents USING rum (search_vector rum_tsvector_addon_ops, published_at) WITH (attach = 'published_at', to = 'search_vector');Ejecuta una consulta que busque documentos que contengan la palabra
enginey los ordene por fecha de publicación. El índice controla la búsqueda y la ordenación de manera eficiente:SELECT title, published_at FROM documents WHERE search_vector @@ to_tsquery('english', 'engine') ORDER BY published_at DESC;
Índice para la búsqueda de arrays
Usa la clase de operador rum_anyarray_ops para indexar columnas de arrays, como una lista
de etiquetas. Esto te permite consultar de manera eficiente los arrays que se superponen (&&), contienen
(@>) o están contenidos por (<@) otros arrays. En el siguiente ejemplo, se agrega una columna tags a la tabla documents.
Agrega una columna
tagsy complétala con datos:ALTER TABLE documents ADD COLUMN tags TEXT[]; INSERT INTO documents (title, content, tags) VALUES ( 'Title4', 'Sample Text', ARRAY['ai', 'ml'] );Crea el índice de RUM en una columna
TEXT[]llamadatags:CREATE INDEX idx_tags_rum ON documents USING rum (tags rum_anyarray_ops);Ejecuta una consulta para encontrar documentos que tengan
aiomlen sus etiquetas:SELECT * FROM documents WHERE tags && '{"ai", "ml"}';
Índice para tipos escalares
Usa las clases de operador rum_<TYPE>_ops para indexar columnas que contengan valores continuos,
como números enteros, marcas de tiempo o números de punto flotante. Estas clases de operadores
te permiten usar el operador <=> para calcular de manera eficiente la distancia
entre los valores. En el siguiente ejemplo, se supone que tienes una tabla llamada
documents.
Agrega una columna de número entero genérica, como
rating, a la tabladocuments:ALTER TABLE documents ADD COLUMN rating INT; UPDATE documents SET rating = floor(random() * 5 + 1);Crea un índice de RUM en la columna
rating:CREATE INDEX idx_rating_rum ON documents USING rum (rating rum_int4_ops);Ejecuta una consulta para encontrar documentos con un
ratingmás cercano al valor 5:SELECT title, rating FROM documents ORDER BY rating <=> 5;
Índice para la búsqueda de hash optimizada ordenada por marca de tiempo
Usa la clase de operador rum_tsvector_hash_addon_ops para combinar los beneficios de
un índice de hash con las capacidades de ordenamiento de un índice de complemento. Esta clase almacena
un hash de cada lexema junto con el valor de una columna adicional. Esta
configuración admite la ordenación eficiente por la columna adicional, pero no
admite la coincidencia de prefijos. En el siguiente ejemplo, se supone que tienes una tabla
llamada documents con una columna search_vector y una columna de marca de tiempo
published_at.
Crea un índice de RUM que use la clase de operador hash y que incluya la marca de tiempo
published_at:CREATE INDEX idx_docs_rum_hash_timestamp ON documents USING rum (search_vector rum_tsvector_hash_addon_ops, published_at) WITH (attach = 'published_at', to = 'search_vector');Ejecuta una consulta que busque documentos que contengan
enginey los ordene por fecha de publicación:SELECT title, published_at FROM documents WHERE search_vector @@ to_tsquery('english', 'engine') ORDER BY published_at DESC;
Índice para consultas almacenadas
Usa la clase de operador rum_tsquery_ops para indexar los valores tsquery. Esto te permite
realizar una "búsqueda inversa" para identificar qué consultas almacenadas coinciden con un documento de entrada
determinado. En el siguiente ejemplo, se crea una tabla llamada queries.
Crea una tabla para almacenar las consultas:
CREATE TABLE queries ( query_text tsquery ); INSERT INTO queries (query_text) VALUES (plainto_tsquery('AlloyDB is fast!'));Crea un índice de RUM en la columna
query_text:CREATE INDEX idx_queries_rum ON queries USING rum (query_text rum_tsquery_ops);Ejecuta una consulta para encontrar las consultas almacenadas que coincidan con un documento:
SELECT * FROM queries WHERE to_tsvector('english', 'AlloyDB is fast') @@ query_text;
Índice para la búsqueda de arrays ordenados por marca de tiempo
Usa la clase de operador rum_anyarray_addon_ops para indexar columnas de arrays junto
con una columna adicional para ordenar. En el siguiente ejemplo, se supone que
tienes una tabla llamada documents con una columna tags y una columna de marca de tiempo
published_at.
Crea un índice de RUM en la columna
tagsque incluya la marca de tiempopublished_at:CREATE INDEX idx_tags_rum_timestamp ON documents USING rum (tags rum_anyarray_addon_ops, published_at) WITH (attach = 'published_at', to = 'tags');Ejecuta una consulta para encontrar documentos con la etiqueta
ai, ordenados por fecha de publicación:SELECT title, published_at FROM documents WHERE tags @> '{"ai"}' ORDER BY published_at DESC;
¿Qué sigue?
- Obtén más información sobre la búsqueda en el texto completo.
- Aprende a ejecutar una búsqueda híbrida de similitud de vectores.