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

news/2025/2/16 2:25:12/

若遇到相似性搜索,现在大家第一想到的首选肯定是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;

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


http://www.ppmy.cn/news/597248.html

相关文章

uniapp使用uni.createInnerAudioContext()实现在app 小程序 h5有声书的倍速功能

uni.createInnerAudioContext()实现在app 小程序 h5有声书的倍速功能 官网提供的api进行的开发&#xff0c;自我感觉没啥问题&#xff0c;但是在不同的端上好像有的好使有的不好使&#xff0c;暂时不知道啥问题 data中的变量&#xff1a;showPlaybackRate: false, <!-- 倍速…

【工具】showdoc导出文档超时问题的解决方案

问题背景 当showdoc需要导出的文档较大时&#xff0c;导出可能会超时 问题分析 通过报错信息可以看出是导出超时&#xff08;超过100s的限制&#xff09; 在网上查找这个报错&#xff0c;大概意思就是php代码执行的超时时间设置为了100s&#xff0c;调整 PHP 的 max_execution…

qt怎么设置widget自动缩放

在Qt中&#xff0c;你可以使用布局管理来实现widget的自动缩放。布局管理允许你的界面在窗口大小改变时&#xff0c;保持元素的相对位置和大小。Qt提供了几种布局管理器&#xff0c;包括水平布局、垂直布局和网格布局。下面是如何使用布局管理来设置widget自动缩放的基本步骤&a…

前端图片上传发现图片倒置解决方案 图片镜像效果实现

图片倒置解决方案 前端使用canvas将颠倒的图片进行旋转矫正 图片镜像效果实现 通过scale调整方向即可。 scale(scaleX, scaleY)&#xff1a;通过在 x 轴乘以 scaleX、在 y 轴乘以 scaleY 来缩放图像。scaleX和 scaleY 的默认值都是 1.0。 通过以下设置可实现图片翻转 scale(…

关于文件上传 以及 图片视频回显的问题

<template><div><!-- 上传文件按钮 --><el-empty description" " :image-size"200"><el-button type"primary" click"uploadFileAdd">点击上传<i class"el-icon-upload el-icon--right"&…

文件上传功能-图像上传

传统上传 1.封装文件上传的接口 import request from /utils/request//上传图片 export const uploadImage(data)>request({url:/common/upload?typeimages,method:POST,data:data })2. <template><div><h1>广告图管理</h1><hr><br&…

使用XShell向服务器上传本地图片完整步骤解析

首先输入账号密码&#xff0c;登录XShell&#xff0c;然后点击菜单栏“新建按钮”&#xff1a; 弹出新建对话属性窗口&#xff0c;在窗口中输入会话名称和主机名&#xff0c;其中会话名称自己命名&#xff0c;主机名就填写连接的服务器的名称&#xff0c;比如我这里填写的是10.…