PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:Finden Sie Sätze, die einem bestimmten Satz am nächsten kommen

Volltextsuche (FTS)

Sie könnten plainto_tsquery() verwenden zu (pro Dokumentation ) ...

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

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

Verwenden Sie es wie folgt:

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

Aber das ist immer noch ziemlich streng und bietet nur eine sehr begrenzte Toleranz für Ähnlichkeiten.

Trigramm-Ähnlichkeit

Eignet sich möglicherweise besser für die Suche nach Ähnlichkeit , bis zu einem gewissen Grad sogar Tippfehler überwinden.

Installieren Sie das zusätzliche Modul pg_trgm , erstellen Sie einen GiST-Index und verwenden Sie den Ähnlichkeitsoperator % bei einer Nächsten-Nachbarn-Suche :

Grundsätzlich mit einem Trigramm GiST-Index auf 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;

Mehr:

Kombiniere beides

Sie können sogar FTS und Trigrammähnlichkeit kombinieren: