tutorial regulares regexp_substr regexp_replace regexp_matches postgres full expresiones example against postgresql full-text-search pattern-matching

regulares - PostgreSQL Full Text Search y Trigram Confusion



regexp_replace postgresql (1)

Sirven propósitos muy diferentes.

  • La búsqueda de texto completo se usa para devolver documentos que coincidan con una consulta de búsqueda de palabras derivadas.
  • Los trigramas te dan un método para comparar dos cadenas y determinar qué tan similares se ven.

Considere los siguientes ejemplos:

SELECT ''cat'' % ''cats''; --true

Lo anterior devuelve true porque ''cat'' es bastante similar a ''cats'' (según lo dictado por el límite pg_trgm).

SELECT ''there is a cat with a dog'' % ''cats''; --false

Lo anterior devuelve false porque % está buscando de manera similar entre las dos cadenas completas, no buscando la palabra cats dentro de la cadena.

SELECT to_tsvector(''there is a cat with a dog'') @@ to_tsquery(''cats''); --true

Esto devuelve true porque el tsvector transformó la cadena en una lista de palabras derivadas e ignoró un montón de palabras comunes (palabras vacías, como ''es'' y ''a'') ... luego buscó la versión derivada de los cats .

Parece que desea utilizar los trigramas para corregir automáticamente su ts_query pero eso no es realmente posible (de ninguna manera eficiente). Ellos realmente no saben que una palabra está mal escrita, cuán similar podría ser a otra palabra. Se pueden usar para buscar una tabla de palabras para intentar encontrar palabras similares, lo que le permite implementar una función de tipo "quiso decir ...", pero esta palabra requiere mantener una tabla separada que contenga todas las palabras utilizadas en su campo de search .

Si tiene algunas palabras o frases mal escritas que desea que coincidan con el índice de texto, es posible que desee consultar Diccionarios de sinónimos.

Estoy un poco confundido con todo el concepto de PostgreSQL, búsqueda de texto completo y Trigram. En mis consultas de búsqueda de texto completo, estoy usando tsvectors, así:

SELECT * FROM articles WHERE search_vector @@ plainto_tsquery(''english'', ''cat, bat, rat'');

El problema es que este método no tiene en cuenta la ortografía. Entonces empecé a leer sobre pg_trgm y pg_trgm :

Mirando a través de otros ejemplos, parece que se usa un trigrama o se usan vectores, pero nunca ambos. Así que mis preguntas son: ¿Alguna vez se usan juntas? ¿Si es así, cómo? ¿Trigrama reemplaza texto completo? ¿Son los trigramas más precisos? ¿Y cómo son los trigramas en el rendimiento?