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.