【问题标题】:Using Levenshtein function on each element in a tsvector?对 tsvector 中的每个元素使用 Levenshtein 函数?
【发布时间】:2012-08-23 22:38:28
【问题描述】:

我正在尝试使用 Postgres 创建模糊搜索,并且一直使用 django-watson 作为基础搜索引擎来工作。

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

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

有没有办法做到这一点?

【问题讨论】:

  • 目前还不清楚你在追求什么。添加一个你想要清楚的例子。并添加涉及表的定义。

标签: postgresql levenshtein-distance fuzzy-search tsvector


【解决方案1】:

考虑使用扩展名pg_trgm 而不是levenshtein()。当使用 GiST 索引来支持 KNN feature in PostgreSQL 9.1 or later 时,它的速度要快几个数量级。

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

CREATE EXTENSION pg_trgm;

并使用<-> or % operator。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多