sql >> データベース >  >> RDS >> PostgreSQL

オートコンプリートフィールド用の同様のUTF-8文字列

    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です。追加の一致をフィルタリングするしきい値かどうかを確認するだけです。



    1. T-SQLを使用して区切り文字を使用して文字列を分割するにはどうすればよいですか?

    2. SUSE12にSQLServerをインストールする方法

    3. Oracleデータベースにブール型はありますか?

    4. 生年月日の制約を確認しますか?