Nepoužíváte třídu operátorů poskytovanou pg_trgm
modul. Vytvořil bych index takto:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Původně jsem zde měl index GIN, ale později jsem se dozvěděl, že GiST je pro tento druh dotazu pravděpodobně ještě vhodnější, protože dokáže vrátit hodnoty seřazené podle podobnosti. Další podrobnosti:
- Postgresql:Shoda vzorů mezi dvěma sloupci
- Rychlé nalezení podobných řetězců pomocí PostgreSQL
Váš dotaz musí odpovídat indexovému výrazu, abyste jej mohli použít.
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
Nicméně „filbert“ a „filé powder“ nejsou ve skutečnosti příliš podobné „fil“ podle operátora %. Mám podezření, že to, co opravdu chcete, je toto:
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
To najde všechny řetězce obsahující hledaný řetězec a seřadí nejlepší shody podle %
nejprve operátor.
A ta šťavnatá část:výraz může používat index GIN nebo GiST od PostgreSQL 9.1 ! Cituji manuál k myši pg_trgm:
Počínaje PostgreSQL 9.1 tyto typy indexů také podporují například indexsearch pro LIKE a ILIKE
Pokud jste skutečně chtěli použít %
operátor:
Zkusili jste snížit prahovou hodnotu pro operátor podobnosti %
pomocí set_limit()
:
SELECT set_limit(0.1);
nebo ještě nižší? Výchozí hodnota je 0,3. Jen abychom viděli, zda je to práh, který filtruje další shody.