ホームページ > データベース > mysql チュートリアル > PostgreSQL で類似した文字列を効率的に見つけるにはどうすればよいですか?

PostgreSQL で類似した文字列を効率的に見つけるにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-06 03:51:40
オリジナル
571 人が閲覧しました

How Can I Efficiently Find Similar Strings in PostgreSQL?

PostgreSQL での類似した文字列の効率的な検索

はじめに: 大規模なデータセットで類似した文字列を検索すると、次の使用時にパフォーマンスの問題が発生する可能性があります。従来の方法。この記事では、PostgreSQL の pg_trgm モジュールを使用して検索プロセスを大幅に高速化するソリューションを紹介します。

SET pg_trgm.similarity_threshold と % 演算子の使用:

指定したクエリ過剰な類似度計算に悩まされます。効率を高めるには、SET pg_trgm.similarity_threshold 設定パラメータと % 演算子を利用します。

SET pg_trgm.similarity_threshold = 0.8;

SELECT similarity(n1.name, n2.name) AS sim, n1.name, n2.name
FROM names n1
JOIN names n2 ON n1.name <> n2.name
AND n1.name % n2.name
ORDER BY sim DESC;
ログイン後にコピー

このアプローチでは、トライグラム GiST インデックスを活用し、検索を大幅に高速化します。

関数の利用インデックス:

パフォーマンスをさらに向上させるには、関数インデックスを使用して、クロス結合の前に一致する可能性のあるものを事前にフィルタリングすることを検討してください。これにより、次のクエリに示すように、必要な類似度計算の数が削減されます。

CREATE FUNCTION first_char(text) RETURNS text AS $$
  SELECT substring(, 1, 1);
$$ LANGUAGE SQL;

CREATE INDEX first_char_idx ON names (first_char(name));
ログイン後にコピー
SELECT similarity(n1.name, n2.name) AS sim, n1.name, n2.name
FROM names n1
JOIN names n2 ON first_char(n1.name) = first_char(n2.name)
AND n1.name <> n2.name
ORDER BY sim DESC;
ログイン後にコピー

結論:

pg_trgm モジュールを使用することで、SET pg_trgm .similarity_threshold、% 演算子、および関数インデックスを使用すると、類似したものを見つけるパフォーマンスを大幅に向上させることができます。 PostgreSQL の文字列 (大規模なデータセットであっても)。

以上がPostgreSQL で類似した文字列を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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