postgresql实现全文搜索相似性搜索

若遇到相似性搜索,现在大家第一想到的首选肯定是es,但用es需要维护还需要在维护数据同步到es的中间件,还有可能遇到数据不同步问题等。

若几千万数据或者几亿数据用postgresql完全足够,下面给出一个实例,因为postgresql很多中文插件或者拼音插件停止维护了,所以我们需要把分词后的中文或者拼音存储到pg。

一.安装插件

pg_trgm是官方维护的插件,可以使用相似性查询和编辑距离查询,以下是一个使用pg_trgm插件进行文本相似性查询的例子,首先,我们需要安装pg_trgm插件。如果使用PostgreSQL 9.1及以上版本,则可以通过以下命令来安装该插件。

CREATE EXTENSION pg_trgm;

二.创建表

其次,我们需要创建一个包含一个text列和一个tokens列的表,其中text列存储将要查询的文本,tokens列存储text列中的分词结果。创建表的SQL语句如下:

CREATE TABLE mytable (
    id SERIAL PRIMARY KEY,
    text VARCHAR(200),
    tokens VARCHAR(200)[]
);

三.插入数据

然后,我们需要向表中插入一些数据,用于演示相似性查询的效果。我们可以使用以下语句向表中插入三条记录:

INSERT INTO mytable (text, tokens) VALUES
  ('今天天气不错啊', ARRAY['今天', '天气', '不错']),
  ('今晚去看电影吗', ARRAY['今晚', '看电影']),
  ('这家餐厅口味很好', ARRAY['这家', '餐厅', '口味', '很好']);

四.查询

现在,我们可以使用similarity函数进行相似性查询了。例如,如果要查找与字符串’今天气候不错’相似度大于0.5,前十的记录,可以使用如下语句:

SELECT * FROM mytable
WHERE word_similarity(tokens, '今天气候不错') > 0.5
ORDER BY word_similarity(tokens, '今天气候不错') DESC
LIMIT 10;

五.纠错(编辑距离)

同样,我们可以用pg_trgm实现纠错,纠错的算法就是用编辑距离实现的,es的纠错也是用编辑距离实现。比如以下实例,例如,如果要查找与字符串 ‘看电影哈’ 编辑距离小于等于2的记录,按照相似度从高到低的顺序返回结果。

SELECT *, 
      word_similarity(tokens, '看电影哈') AS token_similarity
FROM mytable
WHERE levenshtein(tokens, '看电影哈') <= 2
ORDER BY token_similarity DESC;

以上拼音同样可以类似实现,以上情况已经适用很多简单的场景了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值