ホームページ > データベース > mysql チュートリアル > PostgreSQL でアクセントを無視した検索を実現するにはどうすればよいですか?

PostgreSQL でアクセントを無視した検索を実現するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-20 12:21:17
オリジナル
458 人が閲覧しました

How Can I Achieve Accent-Insensitive Searches in PostgreSQL?

アクセントを無視した検索に対する PostgreSQL のアプローチ

一部のデータベース (Microsoft SQL Server など) とは異なり、PostgreSQL はアクセントを区別しない照合順序をネイティブにサポートしません。 PostgreSQL 12 では、大文字と小文字とアクセントを区別しない非決定的な ICU 照合が導入されましたが、これらにはパフォーマンスのトレードオフと操作上の制限が伴います。

PostgreSQL でのアクセントを区別しないクエリの戦略

PostgreSQL でアクセントを区別しない検索を実現するためのメソッドがいくつかあります。

1. unaccent モジュール:

このモジュールは、文字列からアクセントを削除する unaccent() 関数を提供します。 これにより、次のようなクエリが可能になります。

<code class="language-sql">SELECT * FROM users WHERE unaccent(name) = unaccent('João');</code>
ログイン後にコピー

ただし、unaccent() は IMMUTABLE ではないため、式インデックスでの使用が妨げられ、合字 (例: 'ā') は展開されません。

2.最適化された C 関数ラッパー:

unaccent() の制限に対処するためのより効率的な解決策には、IMMUTABLE C 関数ラッパーの作成が含まれます。

<code class="language-sql">CREATE OR REPLACE FUNCTION public.f_unaccent(text)
  RETURNS text
  LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT
RETURN public.immutable_unaccent(regdictionary 'public.unaccent', );</code>
ログイン後にコピー

これにより、式インデックスの作成が可能になります:

<code class="language-sql">CREATE INDEX users_unaccent_name_idx ON users(public.f_unaccent(name));</code>
ログイン後にコピー

クエリではラップされた関数が使用されます。

<code class="language-sql">SELECT * FROM users WHERE f_unaccent(name) = f_unaccent('João');</code>
ログイン後にコピー

3.パターンマッチングと合字に pg_trgm を利用する:

より柔軟なパターン マッチングと合字処理のために、トライグラム インデックスを備えた pg_trgm モジュールが強力なソリューションを提供します。 トライグラム GIN インデックスにより、大文字と小文字を区別しない検索と類似性検出が可能になります。

<code class="language-sql">CREATE INDEX users_unaccent_name_trgm_idx ON users
USING gin (f_unaccent(name) gin_trgm_ops);

SELECT * FROM users WHERE f_unaccent(name) LIKE ('%' || f_unaccent('João') || '%');</code>
ログイン後にコピー

pg_trgm インデックスは標準の B ツリー インデックスよりも多くのリソースを消費することに注意してください。

最適なアプローチの選択は、アプリケーションの特定のニーズに依存し、クエリのパフォーマンスとインデックスのメンテナンス コストおよび合字処理の要件のバランスを考慮します。

以上がPostgreSQL でアクセントを無視した検索を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート