我正在尝试使用 Postgres 创建一个模糊搜索,并且一直使用 django-watson 作为基础搜索引擎来工作。
我有一个名为 search_tsv 的字段,它是一个包含我要搜索的模型的所有字段值的 tsvector。
我想使用 Levenshtein 函数,它完全符合我在文本字段上的要求。但是,我真的不知道如何在 tsvector 的每个单独元素上运行它。
有没有办法做到这一点?
我正在尝试使用 Postgres 创建一个模糊搜索,并且一直使用 django-watson 作为基础搜索引擎来工作。
我有一个名为 search_tsv 的字段,它是一个包含我要搜索的模型的所有字段值的 tsvector。
我想使用 Levenshtein 函数,它完全符合我在文本字段上的要求。但是,我真的不知道如何在 tsvector 的每个单独元素上运行它。
有没有办法做到这一点?
考虑扩展名pg_trgm
而不是levenshtein()
. 使用 GiST 索引支持PostgreSQL 9.1 或更高版本中的 KNN 功能时,速度要快几个数量级。
每个数据库安装一次扩展:
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