Existen dos tipos de índices que se pueden utilizar para acelerar las búsquedas de texto completo: GIN y GiST. Ten en cuenta que los índices no son obligatorios para la búsqueda de texto completo, pero en los casos en los que una columna se busca de forma regular, normalmente es deseable un índice.
Para crear dicho índice, realiza una de las siguientes acciones:
CREATE INDEX name ON table USING GIN (column);
Crea un índice basado en GIN (Generalized Inverted Index).
La columna column debe ser de tipo tsvector.
CREATE INDEX name ON table USING GIST (column [ { DEFAULT | tsvector_ops } (siglen = number) ] );
Crea un índice basado en GiST (Generalized Search Tree).
La columna column puede ser de tipo tsvector o
tsquery.
El parámetro entero opcional siglen determina la longitud de la firma en bytes
(consulta más abajo para ver detalles).
Los índices GIN son el tipo de índice preferido para la búsqueda de texto. Al ser índices invertidos, contienen
una entrada de índice para cada palabra (lexema), con una lista comprimida de posiciones coincidentes.
Las búsquedas de múltiples palabras pueden encontrar la primera coincidencia y luego utilizar el índice para eliminar
las filas a las que les faltan palabras adicionales. Los índices GIN solo almacenan las palabras (lexemas) de los valores
tsvector y no sus etiquetas de peso. Por lo tanto, se necesita una nueva comprobación de la fila de la tabla
cuando se utiliza una consulta que involucra pesos.
Un índice GiST es con pérdida (lossy), lo que significa que el índice podría producir coincidencias
falsas, y es necesario comprobar la fila real de la tabla para eliminar dichas coincidencias falsas.
(PostgreSQL hace esto automáticamente cuando es necesario).
Los índices GiST son con pérdida porque cada documento está representado en el índice por una firma de longitud fija.
La longitud de la firma en bytes está determinada por el valor del parámetro entero opcional siglen.
La longitud de firma predeterminada (cuando no se especifica siglen) es de 124 bytes, y la longitud máxima
de la firma es de 2024 bytes. La firma se genera aplicando una función hash a cada palabra para establecer un bit en una cadena
de n bits, y luego se aplica una operación OR a todos estos bits para producir una firma de documento de n bits. Cuando dos
palabras producen el mismo bit mediante la función hash, habrá una coincidencia falsa. Si todas las palabras de la consulta tienen
coincidencias (reales o falsas), entonces se debe recuperar la fila de la tabla para comprobar si la coincidencia es correcta.
Las firmas más largas conducen a una búsqueda más precisa (escaneando una fracción más pequeña del índice y menos páginas de heap),
a costa de un índice más grande.
Un índice GiST puede ser de cobertura (covering), es decir, utilizar la cláusula INCLUDE. Las columnas
incluidas pueden tener tipos de datos sin ninguna clase de operador GiST. Los atributos incluidos se almacenarán sin comprimir.
La pérdida de precisión provoca una degradación del rendimiento debido a recuperaciones innecesarias de registros de tabla que resultan ser coincidencias falsas. Dado que el acceso aleatorio a los registros de la tabla es lento, esto limita la utilidad de los índices GiST. La probabilidad de coincidencias falsas depende de varios factores, en particular del número de palabras únicas, por lo que se recomienda utilizar diccionarios para reducir este número.
Ten en cuenta que el tiempo de creación del índice GIN a menudo se puede mejorar aumentando el parámetro maintenance_work_mem, mientras que el tiempo de creación del índice GiST no es sensible a ese parámetro.
La partición de grandes colecciones y el uso adecuado de los índices GIN y GiST permiten la implementación de búsquedas muy rápidas con actualización en línea. La partición se puede realizar a nivel de base de datos utilizando la herencia de tablas, o distribuyendo documentos entre servidores y recopilando los resultados de búsqueda externos, por ejemplo, a través del acceso a datos externos (Foreign Data). Esto último es posible porque las funciones de clasificación utilizan únicamente información local.