在tsvector中的每个元素上使用Levenshtein函数?

Ste*_*den 2 postgresql fuzzy-search tsvector levenshtein-distance

我正在尝试使用Postgres创建一个模糊搜索,并一直使用django-watson作为基础搜索引擎来解决问题.

我有一个名为search_tsv的字段,它是一个包含我要搜索的模型的所有字段值的tsvector.

我想要使​​用Levenshtein函数,它在文本字段中完全符合我的要求.但是,我真的不知道如何在tsvector的每个元素上运行它.

有没有办法做到这一点?

Erw*_*ter 6

我会考虑使用扩展pg_trgm而不是levenshtein().如果使用GiST索引备份它可以快几个数量级,这可以利用PostgreSQL 9.1中新的KNN功能.

每个数据库安装一次扩展:

CREATE EXTENSION pg_trgm;
Run Code Online (Sandbox Code Playgroud)

并使用<->%运算符或similarity()函数.已经在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;
Run Code Online (Sandbox Code Playgroud)

返回:

 val | term | trg_dist | lev_dist
-----+------+----------+----------
 cat | brat |    0.875 |        2
 fat | brat |    0.875 |        2
 rat | brat | 0.714286 |        1
Run Code Online (Sandbox Code Playgroud)