Sie verwenden nicht die von pg_trgm
bereitgestellte Operatorklasse Modul. Ich würde einen Index wie folgt erstellen:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Ursprünglich hatte ich hier einen GIN-Index, aber ich habe später erfahren, dass ein GiST für diese Art von Abfrage wahrscheinlich noch besser geeignet ist, weil er nach Ähnlichkeit sortierte Werte zurückgeben kann. Weitere Einzelheiten:
- Postgresql:Übereinstimmungsmuster zwischen zwei Spalten
- Ähnliche Zeichenketten mit PostgreSQL schnell finden
Ihre Abfrage muss mit dem Indexausdruck übereinstimmen, um ihn verwenden zu können.
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
Allerdings sind „Haselnuss“ und „Filé-Pulver“ dem %-Operator zufolge „Fil“ eigentlich nicht sehr ähnlich. Ich vermute, was Sie wirklich wollen, ist dies:
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
Dadurch werden alle Zeichenfolgen gefunden, die die Suchzeichenfolge enthalten, und die besten Übereinstimmungen nach %
sortiert Betreiber zuerst.
Und das Interessante daran:Der Ausdruck kann seit PostgreSQL 9.1 einen GIN- oder GiST-Index verwenden ! Ich zitiere das Handbuch auf dem pg_trgm Moule:
Ab PostgreSQL 9.1 unterstützen diese Indextypen beispielsweise auch Indexsuchen für LIKE und ILIKE
Wenn Sie tatsächlich den %
verwenden wollten Betreiber:
Haben Sie versucht, den Schwellenwert zu senken? für den Ähnlichkeitsoperator %
mit set_limit()
:
SELECT set_limit(0.1);
oder noch niedriger? Der Standardwert ist 0,3. Nur um zu sehen, ob es der Schwellenwert ist, der zusätzliche Übereinstimmungen herausfiltert.