sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:Najděte věty nejbližší dané větě

Full Text Search (FTS)

Můžete použít plainto_tsquery() na (podle dokumentace ) ...

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

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

Použijte to jako:

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

Ale to je stále dost striktní a poskytuje jen velmi omezenou toleranci pro podobnost.

Podobnost trigramů

Může být vhodnější pro hledání podobnosti , dokonce do určité míry překonat překlepy.

Nainstalujte si doplňkový modul pg_trgm , vytvořte index GiST a použijte operátor podobnosti % při hledání nejbližšího souseda :

V podstatě s trigramovým GiST indexem na 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;

Více:

Zkombinujte obě

Dokonce můžete kombinovat FTS a podobnost trigramů:



  1. MySQL sloučí 2 sady výsledků s výjimkou záznamů v první

  2. Typ MySQL pro uložení roku:Smallint nebo Varchar nebo datum?

  3. Odkaz na neinicializovanou kolekci PL/SQL

  4. Mohu mít LINEFEED jako oddělovač ve funkci CONCAT_WS mySQL