pg_trgm
によって提供される演算子クラスを使用していません モジュール。次のようなインデックスを作成します:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
もともとここにGINインデックスがありましたが、類似性でソートされた値を返すことができるため、GiSTがこの種のクエリにおそらくさらに適していることを後で知りました。詳細:
- Postgresql:2つの列間のパターンの一致
- PostgreSQLで類似した文字列をすばやく見つける
クエリを使用するには、インデックス式と一致する必要があります。
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
ただし、%演算子によると、「filbert」と「filépowder」は実際には「fil」とあまり似ていません。あなたが本当に欲しいのはこれだと思います:
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
これにより、検索文字列を含むすべての文字列が検索され、%
に従って最適な文字列が並べ替えられます。 オペレーターが最初です。
そして、ジューシーな部分:PostgreSQL 9.1 以降、式はGINまたはGiSTインデックスを使用できます ! pg_trgm mouleのマニュアルを引用します:
PostgreSQL 9.1以降、これらのインデックスタイプは、たとえばLIKEやILIKEのインデックス検索もサポートしています
。
実際に%
を使用するつもりだった場合 演算子:
しきい値を下げるを試しましたか 類似度演算子の場合%
set_limit()
を使用 :
SELECT set_limit(0.1);
またはさらに低い?デフォルトは0.3です。追加の一致をフィルタリングするしきい値かどうかを確認するだけです。