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

问题描述 投票:0回答:1

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

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

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

有办法做到这一点吗?

postgresql levenshtein-distance fuzzy-search tsvector
1个回答
11
投票

考虑扩展名

pg_trgm
而不是
levenshtein()
。当使用 GiST 索引支持 PostgreSQL 中的 KNN 功能时,速度会快几个数量级。

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

CREATE EXTENSION pg_trgm;

并使用

<->
%
运算符
。几个相关的答案已经发布在 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
© www.soinside.com 2019 - 2024. All rights reserved.