在Postgresql中进行关键字查找

在Postgresql中通过关键字查询,一般情况下,利用like语句。比如:
select name from poi where name like '%key word%'.
但是众所周知,这样的匹配率不尽如人意。

本文通过示例,利用pg_trgm扩展进行实现更完美的关键字查询。

新建数据表如下:

-- public.t_poi definition
-- Drop table
-- DROP TABLE public.t_poi;
CREATE TABLE public.t_poi (id varchar NULL,    --唯一标示pname varchar NULL, --名称dtype varchar NULL, --类别address varchar NULL--地址
);

默认表中的数据存储了上千万条记录。

假设其中有如下数据:

SELECT name as pname,dtype,address FROM public.t_poi;pname                    |dtype             |address                  |
-------------------------+------------------+-------------------------+
黑龙江广播电视网络股份有限公司(通河分公司营业厅)|生活服务;生活服务场所;生活服务场所|建安路与民强街交叉口东北50米通河县广播电视台附近|
闻名劳务咨询公司                 |生活服务;中介机构;中介机构    |通河镇长安街隆泰小区1号楼门市          |
四达劳务信息咨询通河分公司            |生活服务;人才市场;人才市场    |向阳街百合名苑小区4门市             |
黑龙江隆凯房地产估价有限公司           |生活服务;事务所;评估事务所    |隆达路1号附近                  |
哈尔滨旭苑会计服务公司              |生活服务;事务所;会计师事务所   |园丁公寓北门东侧                 |
哈工工具销售公司                 |购物服务;家居建材市场;建材五金市场|南马路86|
哈通物流有限公司                 |生活服务;物流速递;物流速递    |中央大街6号附近                 |
刚子保洁服务公司                 |生活服务;中介机构;中介机构    |金街40|
东讯劳务输出公司                 |生活服务;人才市场;人才市场    |通河镇隆达路大千市场道南中通速递对面       |
神舟线缆有限公司                 |购物服务;家居建材市场;建材五金市场|景阳街140|

使用like查询包含"夕阳"关键字的记录,语句可能如下

SELECT * FROM public.t_poi WHERE PNAME LIKE '%夕阳红%老年%公寓%';
pname              |dtype            |address          |
-------------------+-----------------+-----------------+
延寿夕阳红老年公寓          |体育休闲服务;度假疗养场所;疗养院|东新华街与爱民南胡同交叉口北50|
夕阳红老年公寓(通河县红十字医院西北)|体育休闲服务;度假疗养场所;疗养院|中央大街(通河县红十字医院西北) |
道里区夕阳红老年公寓         |体育休闲服务;度假疗养场所;疗养院|安静街104-2|
夕阳红老年公寓(清园东)       |体育休闲服务;度假疗养场所;疗养院|信恒现代城文园B栋7门市     |
夕阳红老年公寓            |体育休闲服务;度假疗养场所;疗养院|果园星城a区111|
夕阳红老年公寓(信恒现代城东北)   |体育休闲服务;度假疗养场所;疗养院|信恒现代城文园b栋7门市     |
夕阳红老年公寓            |体育休闲服务;度假疗养场所;疗养院|团结路方正镇政府东南100|

pg_trgm的方法如下:
先安装扩展:

CREATE EXTENSION pg_trgm;  

此时查询可以变为如下方式:

SELECT name as pname,dtype,address FROM  public.t_poi ORDER BY (name <->'夕阳红老年公寓') limit 10;
pname              |dtype             |address          |
-------------------+------------------+-----------------+
夕阳红老年公寓            |体育休闲服务;度假疗养场所;疗养院 |果园星城a区111|
夕阳红老年公寓            |体育休闲服务;度假疗养场所;疗养院 |团结路方正镇政府东南100|
夕阳红老年公寓(清园东)       |体育休闲服务;度假疗养场所;疗养院 |信恒现代城文园B栋7门市     |
夕阳红老年公寓(信恒现代城东北)   |体育休闲服务;度假疗养场所;疗养院 |信恒现代城文园b栋7门市     |
夕阳老年公寓             |体育休闲服务;度假疗养场所;疗养院 |延川大街146|
延寿夕阳红老年公寓          |体育休闲服务;度假疗养场所;疗养院 |东新华街与爱民南胡同交叉口北50|
道里区夕阳红老年公寓         |体育休闲服务;度假疗养场所;疗养院 |安静街104-2|
鑫阳红老年公寓            |体育休闲服务;度假疗养场所;疗养院 |丁香街与金街交叉口西北50|
夕阳红老年公寓(通河县红十字医院西北)|体育休闲服务;度假疗养场所;疗养院 |中央大街(通河县红十字医院西北) |
夕阳红老年服务站           |生活服务;生活服务场所;生活服务场所|新疆街道新祥里街劳动局家属楼61|

在实际查找中,可能在pname,dtype,address三列同时查找,所以创建索引如下:

CREATE INDEX idx_poi_similarity ON public.t_poi USING gist (((((pname)::text || (dtype)::text) || (address)::text)) gist_trgm_ops);

由于<->方法类似与近似值计算,所如果被查找列如果比较长的情况下,查找结果可能不尽如人意。

所以结合实际情况对查询进行优化:

select pname,dtype,address from
(select distinct * from (--完全包含是我们期望的结果,但是相似度却不一定很高--比如字段中存储了100个字符,搜索的只有两个字符--相似性相比于和搜索结果长度一样,但是只有一个字符差异的记录要低--所以我们先查找包含的记录。(select name as pname,dtype,address,0 as OD from public.t_poi pd where strpos(name||dtype||address,'夕阳红老年公寓') > 0 limit 10)union all(select name as pname,dtype,address,1 as OD from public.t_poi pd order by (name||dtype||address <-> '夕阳红老年公寓') limit 10)) a 
) x  limit 10;
pname           |dtype             |address          |
----------------+------------------+-----------------+
夕阳红老年服务站        |生活服务;生活服务场所;生活服务场所|新疆街道新祥里街劳动局家属楼61|
夕阳红老年公寓         |体育休闲服务;度假疗养场所;疗养院 |果园星城a区111|
夕阳红老年公寓         |体育休闲服务;度假疗养场所;疗养院 |果园星城a区111|
夕阳红老年公寓         |体育休闲服务;度假疗养场所;疗养院 |团结路方正镇政府东南100|
夕阳红老年公寓(信恒现代城东北)|体育休闲服务;度假疗养场所;疗养院 |信恒现代城文园b栋7门市     |
夕阳红牙齿美容         |医疗保健服务;诊所;诊所      |庆木公路西50|
夕阳红老年公寓(清园东)    |体育休闲服务;度假疗养场所;疗养院 |信恒现代城文园B栋7门市     |
道里区夕阳红老年公寓      |体育休闲服务;度假疗养场所;疗养院 |安静街104-2|
道里区夕阳红老年公寓      |体育休闲服务;度假疗养场所;疗养院 |安静街104-2|
夕阳红老年公寓(信恒现代城东北)|体育休闲服务;度假疗养场所;疗养院 |信恒现代城文园b栋7门市     |

关于pg_trgm的详情,请查看pg_trgm。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(三) 垃圾回收

一、自动垃圾回收 1.1 C/C++的内存管理 在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。 内存泄漏指的是不再使用的对象在系统中…

【蓝桥杯选拔赛真题01】C++参赛建议 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++参赛建议 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

矩阵的运算

目标&#xff1a;实现一个能进行稀疏矩阵基本运算(包括加、减、乘)的运算器。 &#xff08;1&#xff09;以三元组顺序表表示稀疏矩阵&#xff0c;实现两个矩阵相加、相减、相乘的运算 &#xff08;2&#xff09;稀疏矩阵的输入形式为三元组表示&#xff0c;运算结果则以通常…

函数指针——回调函数、函数Table

目录 一、前言 二、回调函数 三、函数Table 四、高阶用法 一、前言 开发面对对象的C工程和大型复杂工程中面对多事件多状态情况下&#xff0c;使用函数数组将使工程变得简洁、容易维护 二、回调函数 函数指针&#xff1a; 可变参数&#xff1a; 返回类型 函数名&#xf…

简述JVM

文章目录 JVM简介JVM运行时数据区堆(线程共享)方法区/元空间/元数据区(线程共享)栈程序计数器 JVM类加载类加载过程双亲委派模型 垃圾回收机制(GC)判断对象是否为垃圾判断是否被引用指向 如何清理垃圾, 释放对象? JVM简介 JVM 是 Java Virtual Machine 的简称, 意为Java虚拟机…

VSCode:清理ipch缓存

VSCode使用了一段时间&#xff0c;发现有些变慢&#xff0c;电脑管家扫描后&#xff0c;提示“AppData\Local\Microsoft\vscode-cpptools\ipch”目录下有很多缓存文件可以清理。 查询了一下&#xff1a;C/C 扩展常见问题解答 (visualstudio.com) 该件夹内包含缓存的预编译头文…

WSL的秘钥被修改了要怎么弄

WSL的秘钥被修改了要怎么弄 gitgithub.com: Permission denied (publickey).ssh-add -l但是我是想加到github上的guiaguaide1.github.com里面哎&#xff0c;为什么这个是shengyi gitgithub.com: Permission denied (publickey). git push -u origin报错 aaaASUS:~/ML/paper/A…

kibana监控

采取方式 Elastic Agent &#xff1a;更完善的功能 Metricbeat&#xff1a;轻量级指标收集&#xff08;采用&#xff09; 传统收集方法&#xff1a;使用内部导出器收集指标&#xff0c;已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…

基于Jenkins实现接口自动化持续集成

一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程 3、源码管理 需要将脚本推送到远程仓库中 4、构建触发器 可以选择定时构建和轮询SCM 定时构建&#xff1a;根据设置的定时时间&#xff0c;自动执行定…

c++系列之vector类模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 构造函数 vector() //_begin表示有效成员的开始 //_finish表示有效成员的大小…

python实现批量pdf转txt和word

文章目录 背景需求环境安装完整代码效果 背景需求 已经获取到了大量的pdf在download文件夹中&#xff0c;但是我需要的是txt文件和word文件&#xff5e; 环境安装 pip install pdf2docx pdfminer.six完整代码 # pip install pdf2docx pdfminer.siximport os from pdf2docx …

idea 基础设置

1、设置 IDEA 主题 2、自动导包和优化多余的包 3、同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;导包合并为* 4、显示行号 &#xff0c; 方法和方法间的分隔符&#xff1a; 5、忽略大小写&#xff0c;进行提示 6、多个类不隐藏&#xff0c;多行显示 7、设置默认的…

面试题 05.01. 插入

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 05.01. 插入 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 截取 N 第 j 位到 31 位&#xff0c;M 低 j-i1 位&#xff0c;N 低 i 位&#xff0c;拼接即可。 解题代码&#xff1a;…

sys.dm_exec_requests中statement_start_offset与statement_end_offset

文章目录 1.缘起2.根因3.示例4.附录 1.缘起 mssql中查早阻塞与及其相关联的sql时&#xff0c;遇到如下内容&#xff0c;故记录一下&#xff0c; substring(dest_blocked.text,der.statement_start_offset/21,(case when der.statement_end_offset-1 then DATALENGTH(der.sta…

Kotlin数据流概览

文章目录 一 什么是数据流二 创建数据流三 修改数据流四 从数据流中进行收集五 数据流捕获异常六 在不同 CoroutineContext 中执行七 Jetpack 库中的数据流八 将基于回调的 API 转换为数据流 一 什么是数据流 数据流以协程为基础构建&#xff0c;可提供多个值。从概念上来讲&a…

如何确定Apache Kafka的大小和规模

调整或扩展Kafka以获得最佳成本和性能的第一步是了解数据流平台如何使用资源。这里给一些实用的建议。 实现Apache Kafka的团队&#xff0c;或者扩展他们对强大的开源分布式事件流平台的使用&#xff0c;通常需要帮助理解如何根据他们的需求正确地调整和扩展Kafka资源。这可能…

TensorFlow学习:使用官方模型和自己的训练数据进行图片分类

前言 教程来源&#xff1a;清华大佬重讲机器视觉&#xff01;TensorFlowOpencv&#xff1a;深度学习机器视觉图像处理实战教程&#xff0c;物体检测/缺陷检测/图像识别 注&#xff1a; 这个教程与官网教程有些区别&#xff0c;教程里的api比较旧&#xff0c;核心思想是没有变…

分享一下怎么做多门店商城系统

随着互联网的快速发展&#xff0c;传统实体店面临着巨大的挑战。为了更好地适应市场变化&#xff0c;提高竞争力&#xff0c;多门店商城系统应运而生。这种新型的商业模式&#xff0c;旨在通过线上线下融合&#xff0c;实现门店之间的互联互通&#xff0c;提高运营效率&#xf…

PyQt5的一些问题(持续更新中)

以后会不定时更新 PyQt5警告 DeprecationWarning: sipPyTypeDict() is deprecated, the extension module should use sipPyTypeDictRef() instead https://stackoverflow.com/questions/77333277/deprecationwarning-sippytypedict-is-deprecated-pyqt5 要么升级Python版本…

【会议征稿通知】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)

2024第四届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff09; 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff0…