sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:encuentre oraciones más cercanas a una oración dada

Búsqueda de texto completo (FTS)

Podrías usar plainto_tsquery() a (por documentación ) ...

SELECT plainto_tsquery('english', 'Sentence: with irrelevant words (and punctuation) in it.')

 plainto_tsquery
------------------
 'sentenc' & 'irrelev' & 'word' & 'punctuat'

Úselo como:

SELECT *
FROM   tbl
WHERE  to_tsvector('english', sentence) @@ plainto_tsquery('english', 'My new sentence');

Pero eso sigue siendo bastante estricto y solo proporciona una tolerancia muy limitada a la similitud.

Semejanza de trigramas

Podría ser más adecuado para buscar similitud , incluso superar errores tipográficos hasta cierto punto.

Instale el módulo adicional pg_trgm , cree un índice GiST y use el operador de similitud % en una búsqueda de vecino más cercano :

Básicamente, con un índice de trigrama GiST en sentence :

-- SELECT set_limit(0.3);  -- adjust tolerance if needed

SELECT *
FROM   tbl
WHERE  sentence % 'My new sentence'
ORDER  BY sentence <-> 'My new sentence'
LIMIT  10;

Más:

Combina ambos

Incluso puedes combinar FTS y similitud de trigramas: