sql >> Database >  >> RDS >> PostgreSQL

Vergelijkbare UTF-8-tekenreeksen voor veld voor automatisch aanvullen

U gebruikt niet de operatorklasse die wordt geboden door de pg_trgm module. Ik zou een index als deze maken:

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

Oorspronkelijk had ik hier een GIN-index, maar later leerde ik dat een GiST waarschijnlijk nog beter geschikt is voor dit soort zoekopdrachten omdat het waarden kan retourneren die zijn gesorteerd op overeenkomst. Meer details:

  • Postgresql:overeenkomende patronen tussen twee kolommen
  • Snel vergelijkbare strings vinden met PostgreSQL

Uw zoekopdracht moet overeenkomen met de index-expressie om er gebruik van te kunnen maken.

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

Echter, "filbert" en "filé powder" lijken niet erg op "fil" volgens de %-operator. Ik vermoed dat je dit echt wilt:

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

Dit zal alle tekenreeksen vinden die de zoekreeks bevatten en de beste overeenkomsten sorteren volgens de % operator eerst.

En het sappige deel:de uitdrukking kan een GIN- of GiST-index gebruiken sinds PostgreSQL 9.1 ! Ik citeer de handleiding op de pg_trgm-moule:

Vanaf PostgreSQL 9.1 ondersteunen deze indextypen ook indexzoekopdrachten voor bijvoorbeeld LIKE en ILIKE

Als je eigenlijk de % . wilde gebruiken operator:

Heb je geprobeerd de drempel te verlagen voor de gelijkenis-operator % met set_limit() :

SELECT set_limit(0.1);

of nog lager? De standaardwaarde is 0,3. Gewoon om te zien of dit de drempel is die extra overeenkomsten filtert.



  1. Hoe MySQL starten met --skip-grant-tables?

  2. Meerdere datacenterconfiguraties met Galera Cluster voor MySQL of MariaDB

  3. Hoe tel je dagen behalve zondag tussen twee datums in Postgres?

  4. Stop alsjeblieft met het gebruik van dit UPSERT-antipatroon!