tutorial to_tsquery full against postgresql indexing full-text-search

postgresql - to_tsquery - Diferencia entre GiST y GIN



postgresql @@ (1)

Estoy implementando una tabla que tiene una columna con un tipo de datos de tsvector y estoy tratando de entender qué índice sería mejor usar.

GIN o GiST?

Al mirar a través de la documentación de postgres aquí parece que entiendo eso:

  • GiST es más rápido de actualizar y construir el índice y es menos preciso que la ginebra.

  • GIN es más lento para actualizar y construir el índice pero es más preciso.

De acuerdo, entonces, ¿por qué alguien querría un campo indexado por esencia sobre la ginebra? Si gist podría darte los resultados equivocados? Debe haber alguna ventaja (fuera del rendimiento) en esto.

¿Alguien puede explicar en términos sencillos cuándo querría usar GIN vs. GiST?


No creo que pueda explicarlo mejor que el manual :

Al elegir qué tipo de índice usar, GiST o GIN, considere estas diferencias de rendimiento:

  • Las búsquedas en el índice GIN son aproximadamente tres veces más rápidas que GiST

  • Los índices GIN tardan aproximadamente tres veces más en construirse que GiST

  • Los índices GIN son moderadamente más lentos de actualizar que los índices GiST, pero son 10 veces más lentos si se deshabilita el soporte de actualización rápida [...]

  • Los índices GIN son de dos a tres veces más grandes que los índices GiST

El enlace es al manual actual , la cita es de la versión para 9.4, mientras que su enlace es a la versión 9.1 (¿por alguna razón?).

Las estimaciones de tamaño y rendimiento parecen estar algo desactualizadas en el manual, y desde entonces han sido eliminadas.
Con Postgres 9.4, las probabilidades han cambiado sustancialmente a favor de GIN .
Las notas de publicación de Postgres 9.4 incluyen:

  • Reducir el tamaño del índice de GIN (Alexander Korotkov, Heikki Linnakangas) [...]

  • Mejora la velocidad de las búsquedas de GIN de varias teclas (Alexander Korotkov, Heikki Linnakangas)

Tenga en cuenta que hay casos de uso especiales que requieren uno u otro.

Una cosa que entendiste mal: nunca obtienes resultados erróneos con un índice GiST. El índice opera con valores hash, que pueden llevar a falsos positivos en el índice. Esto solo debería ser relevante con una gran cantidad de palabras diferentes en sus documentos. Los falsos positivos se eliminan después de volver a verificar la fila real en cualquier caso. El manual :

Un índice GiST tiene pérdidas, lo que significa que el índice puede producir coincidencias falsas, y es necesario verificar la fila de la tabla real para eliminar tales coincidencias falsas. ( PostgreSQL hace esto automáticamente cuando es necesario. )

Énfasis en negrita el mio