sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:vind zinnen die het dichtst bij een bepaalde zin liggen

Volledige tekst zoeken (FTS)

Je zou plainto_tsquery() . kunnen gebruiken naar (per documentatie ) ...

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

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

Gebruik het als:

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

Maar dat is nog steeds vrij streng en biedt slechts een zeer beperkte tolerantie voor gelijkenis.

Trigram-overeenkomst

Misschien beter geschikt om te zoeken naar overeenkomst , zelfs typefouten tot op zekere hoogte overwinnen.

Installeer de extra module pg_trgm , maak een GiST-index en gebruik de similarity-operator % in een zoekopdracht naaste buren :

Kortom, met een trigram GiST-index op 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;

Meer:

Beide combineren

Je kunt zelfs FTS en trigram-overeenkomst combineren:



  1. Hoe pascal zaak te forceren met Oracle's Entity Framework-ondersteuning?

  2. 2 manieren om een ​​getal om te zetten naar octaal in MySQL

  3. Wat doet de MySQL 5.6-fout? InnoDB ondersteunt momenteel het maken van één FULLTEXT-index tegelijk. Probeer LOCK=SHARED bedoel?

  4. Hilarische tweets over het leven van een DBA