sql >> Databasteknik >  >> RDS >> PostgreSQL

Liknande UTF-8-strängar för autokompletteringsfält

Du använder inte operatorklassen som tillhandahålls av pg_trgm modul. Jag skulle skapa ett index så här:

CREATE INDEX label_Lower_unaccent_trgm_idx
ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);

Ursprungligen hade jag ett GIN-index här, men jag lärde mig senare att en GiST förmodligen är ännu bättre lämpad för den här typen av frågor eftersom den kan returnera värden sorterade efter likhet. Mer information:

  • Postgresql:Matchande mönster mellan två kolumner
  • Snabbt att hitta liknande strängar med PostgreSQL

Din fråga måste matcha indexuttrycket för att kunna använda det.

SELECT label
FROM   the_table
WHERE  lower(unaccent_text(label)) % 'fil'
ORDER  BY similarity(label, 'fil') DESC -- it's ok to use original string here

Men "filbert" och "filépulver" är faktiskt inte särskilt lika "fil" enligt %-operatören. Jag misstänker att det du verkligen vill är detta:

SELECT label
FROM   the_table
WHERE  lower(unaccent_text(label)) ~~ '%fil%'
ORDER  BY similarity(label, 'fil') DESC -- it's ok to use original string here

Detta kommer att hitta alla strängar som innehåller söksträngen och sortera de bästa matchningarna enligt % operatör först.

Och den saftiga delen:uttrycket kan använda ett GIN- eller GiST-index sedan PostgreSQL 9.1 ! Jag citerar manualen på pg_trgm-modulen:

Från och med PostgreSQL 9.1 stöder dessa indextyper även indexsökningar för till exempel LIKE och ILIKE

Om du egentligen menade att använda % operatör:

Har du testat att sänka tröskeln för likhetsoperatorn % med set_limit() :

SELECT set_limit(0.1);

eller ännu lägre? Standard är 0,3. Bara för att se om det är tröskeln som filtrerar ytterligare matchningar.



  1. Vad är standardbegränsningsnamnet i PostgreSQL?

  2. Hur man begränsar MySQL-portåtkomst

  3. Fördelar med att använda Microsoft Access-mallar

  4. Lägg till ett jobbsteg till ett befintligt SQL Server Agent Job (T-SQL)