PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ähnliche UTF-8-Strings für das Autocomplete-Feld

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.