4

私はPostgresを使用してあいまい検索を作成しようとしています.django-watsonをベース検索エンジンとして使用しています。

検索するモデ​​ルのすべてのフィールド値を含む tsvector である search_tsv というフィールドがあります。

私はレーベンシュタイン関数を使用したいと思っていました。これは、テキスト フィールドで必要なことを正確に行います。ただし、tsvector の個々の要素ごとに実行する方法がよくわかりません。

これを行う方法はありますか?

4

1 に答える 1

9

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
于 2012-08-23T22:58:27.740 に答える