私はPostgresを使用してあいまい検索を作成しようとしています.django-watsonをベース検索エンジンとして使用しています。
検索するモデルのすべてのフィールド値を含む tsvector である search_tsv というフィールドがあります。
私はレーベンシュタイン関数を使用したいと思っていました。これは、テキスト フィールドで必要なことを正確に行います。ただし、tsvector の個々の要素ごとに実行する方法がよくわかりません。
これを行う方法はありますか?
私はPostgresを使用してあいまい検索を作成しようとしています.django-watsonをベース検索エンジンとして使用しています。
検索するモデルのすべてのフィールド値を含む tsvector である search_tsv というフィールドがあります。
私はレーベンシュタイン関数を使用したいと思っていました。これは、テキスト フィールドで必要なことを正確に行います。ただし、tsvector の個々の要素ごとに実行する方法がよくわかりません。
これを行う方法はありますか?
pg_trgm
の代わりに拡張子を検討してくださいlevenshtein()
。PostgreSQL 9.1 以降で KNN 機能をサポートするために GiST インデックスを使用すると、桁違いに高速になります。
データベースごとに拡張機能を 1 回インストールします。
CREATE EXTENSION pg_trgm;
<->
or%
演算子を使用します。いくつかの関連する回答がSOに投稿されています.pg_tgrm [PostgreSQL]を検索してください...
あなたが望むかもしれないものでワイルドショット:
WITH x AS (
SELECT unnest(string_to_array(trim(strip(
'fat:2,4 cat:3 rat:5A'::tsvector)::text, ''''), ''' ''')) AS val
) -- provide ts_vector, extract strings
, y AS( SELECT 'brat'::text AS term) -- provide term to match
SELECT val, term
,(val <-> term) AS trg_dist -- distance operator
,levenshtein(val, term) AS lev_dist
FROM x, y;
戻り値:
val | term | trg_dist | lev_dist
-----+------+----------+----------
cat | brat | 0.875 | 2
fat | brat | 0.875 | 2
rat | brat | 0.714286 | 1