作者:曲艺伟/彭智

在地图或地理信息有关的场景里 ,地址关键词的检索尤其重要。比如打开百度地图,想要查询某个位置的信息“北京市海淀区清华东路17号中国农业大学”,往往我们输入的是关键词“中国农业大学”而不是精确到街道的详细地址信息。在地址关键词检索的背后,需要的是一款可以支持全文检索和模糊查询的数据库与之匹配,以此快速提高地址检索的效率。

PostgreSQL被誉为“世界上可获得的最先进的开源数据库 ”,拥有很强的文本搜索能力,不仅支持全文检索,PostgreSQL还支持模糊查询、正则查询。除此之外,PostgreSQL还内置了表达式索引、Gin索引功能,配合丰富的插件生态,在地址关键词检索方向有比较大的优势。

本文介绍了一种基于PostgreSQL物流地址关键词检索的方法,以此来说明如何用PostgreSQL提升物流地址关键词的检索效率。

应用背景

在需要地址检索的场景中,用户输入地址文本后需要对地址进行分词,然后通过全文索引技术与地址语料数据库进行匹配,得到规范化的地址信息,并在此基础上进行地址定位。通常地址查询语句在经过地址分词处理后会被分割成几段关键词,通过关键词匹配到历史地址语料数据库,再返回查询语句得到查询结果。
通常从用户输入关键词查询到得到返回结果由于关键词分词和匹配方法不同,会耗时几秒到几十秒不等。

检索数据库中的条目是很基本常见的功能,实现的方法也很多,常见包括:

1、基于Elasticsearch 或 Lucene这类专业独立的检索引擎实现

2、基于数据库自带的检索功能实现

虽然基于Elasticsearch这类系统能实现比较灵活的检索功能,但开发和运维成本也将大大增加,如何利用PostgresSQL内置的功能快速高效的实现大多数中文检索场景是我们要讨论的技术方案。

技术方案

GIN(Generalized Inverted Index, 通用倒排索引) 是一个存储对(key, posting list)集合的索引结构,其中key是一个键值,而posting list 是一组出现过key的位置。如(‘hello’, ‘14:2 23:4’)中,表示hello在14:2和23:4这两个位置出现过,在PostgreSQL中这些位置实际上就是元组的tid。表中的每一个属性在建立索引时,都可能会被解析为多个键值,所以同一个元组的tid可能会出现在多个key的posting list中。通过这种索引结构可以快速的查找到包含指定关键字的元组。

pg_trgm是PostgreSQL基于N-gram模型分词的扩展插件,它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列,pg_trgm就是三元的3-Gram,每连续的3个字符为一个TOKEN,然后在对TOKEN建立GIN倒排索引,就可以进行高效、精准的模糊查询。

pgbigm与pg_trgm类似,也是PostgreSQL基于N-gram模型分词的扩展插件,区别在于pgbigm是二元的2-Gram。

结合PostgreSQL 索引和分词模型的特点,我们构建了1亿行左右的北京区域的本文地址数据进行性能测试,对比分析PostgreSQL在物流关键词检索的场景里有明显效率的提升,测试结果如下:

从以上结果可以看出,无论是pg_trgm+gin还是pgbigm+gin性能比常用的Btree在进行模糊查询的时候,性能要好很多。同时,因为pg_trgm生成的TOKEN是三个字符,只有在三个字符以上条件,才能匹配到对应的TOKEN,当小于3个字符,需要前后模糊搜索1个或者2个字符,所以检索性能下降比较明显,相比来说pgbigm(基于二元的Tri-Gram)在处理单字、双字字符的模糊查询效率都比较高。由于物流的关键字都是三个字符以上,所以采用的是pg_trgm+gin的方案进行关键词检索查询,从而保证毫秒级别的响应时间。

另外对于文本地址数据,往往都具备自然语言的特性,jieba结巴分词是一个强大的分词库,分词更加贴合业务属性特点,主要功能包含:支持不同模式的分词、自定义字典、关键字提取、词性标注。pg_jieba运用了jieba分词算法,构建了PostgreSQL中文分词插件,分词效果也有不错的表现。

总结

综上,PostgreSQL支持丰富的索引,具备强大的全文检索能力以及多样的插件生态,支持不同场景下的文本查询,用户完全不需要将数据同步到搜索引擎,再来查询,使用PostgreSQL可以大幅度的简化用户的架构,开发成本,同时保证数据查询的绝对实时性。

京东云基于开源的 PostgreSQL构建的一款功能强大的关系型数据库云数据库 PostgreSQL ,支持丰富的数据类型及地理信息扩展,具有强大的并行计算能力。支持备份、监控、迁移等全套解决方案。详情可点击链:
https://www.jdcloud.com/cn/products/jcs-for-postgresql

京东云PostgreSQL在GIS场景的应用分享相关推荐

  1. 张腾:腾讯云融合通信应用场景及案例分享

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云加社区技术沙龙发表于腾讯云技术沙龙 张腾,腾讯通信云高级产品经理,先后负责过手机.智能硬件等终端产品,对运营商.即时通信.音视频产品 ...

  2. 【​观察】开启智能教育全新模式 京东云价值与使命升级

    申耀的科技观察 读懂科技,赢取未来! 众所周知,"十三五"阶段,中国教育模式.形态.内容和学习方式都在发生深刻变革,"资源不平衡"和"管理不协同&qu ...

  3. 京东云入选2019年度TOP100全球软件案例 新一代服务治理框架加速行业落地

    11月14日-17日, 2019TOP100全球软件案例研究峰会(TOP100summit)在北京国家会议中心举办.Top100summit是科技界一年一度的案例研究峰会,每年会秉承"从用户 ...

  4. 京东云开发者|京东云RDS数据迁移常见场景攻略

    云时代已经来临,云上很多场景下都需要数据的迁移.备份和流转,各大云厂商也大都提供了自己的迁移工具.本文主要介绍京东云数据库为解决用户数据迁移的常见场景所提供的解决方案. 场景一:数据迁移上云 数据迁移 ...

  5. 京东云分布式链路追踪在金融场景的最佳实践

    微服务是近几年最流行的软件架构设计理念,和容器.devops一起构成了云原生的技术基础.微服务源于对产品快速交付的市场诉求,通过采取一系列的自动化测试.持续集成等敏捷开发实践,激活了组织效率,也增强了 ...

  6. json替换table下的所有值_京东云所有地域正式支持 MySQL 8.0!

    京东云云数据库 RDS 在所有地域正式支持 MySQL 8.0! MySQL 8.0 是目前 MySQL 社区的最新版本,相比较 MySQL 5.7,其支持了很多新的特性以及对原有功能做了重大更新和优 ...

  7. 京东云主机 mysql_京东云所有地域正式支持 MySQL 8.0!

    京东云云数据库 RDS 在所有地域正式支持 MySQL 8.0!MySQL 8.0 是目前 MySQL 社区的最新版本,相比较 MySQL 5.7,其支持了很多新的特性以及对原有功能做了重大更新和优化 ...

  8. 在线数据迁移,数字化时代的必修课——京东云数据迁移实践

    打破数据边界,是数字化时代常挂在嘴边的一句话,数据的价值是在流动中体现的,数据应用也是如此.以往为了满足开发.测试.数据保护容灾和数据分析的需要,我们不断对数据进行复制.备份.迁移,因此数据迁移非常重 ...

  9. PostgreSQL 179个场景

    案例 1.<多字段,任意组合(0建模) - 毫秒级实时圈人 - 最佳实践> 2.<IoT(物联网)极限写入.消费 最佳实践 - 块级(ctid)扫描> 3.数据采样和脱敏实践 ...

最新文章

  1. TCP连接建立与终止,及状态转换
  2. 删除git commit 的 UserInterfaceState.xcuserstate 文件
  3. 小心陷入MySQL索引的坑
  4. Flex与.NET互操作(三):基于WebService的数据访问(下)
  5. 批量打印pdf并合并_CAD批量打印攻略
  6. 数据连接java面试题
  7. 网易视频云:分布式转码服务高可用浅析
  8. 水泵怎么做_燃气壁挂炉初次调试,要怎么做才好?
  9. VC中借助DirectDraw实现水波的模拟
  10. 声网(agora)音视频通话sdk—微信小程序demo
  11. 读书笔记——自己动手写网络爬虫--图的优先遍历
  12. 用matlab画旋转抛物面_MAELAB (1)画出旋转抛物面z=x^2 y^2 编程(2)matlab 画出锥面z=(x^2+y^2)^(1/2)编程...
  13. 基于51单片机出租车计费设计(proteus仿真+程序+原理图+设计说明书)
  14. JVM(四).Class 文件结构(附字节码完整解析)
  15. 调用百度地图进行路线规划
  16. kali自带浏览器上不了网的解决办法
  17. 手游测试(测试内容、测试流程、测试用例)
  18. 身为IT人你应该知道的几个威客网站【转】
  19. office 2016下载安装
  20. java 调用matlab rank_科学网—Matlab: X is rank deficient - 李旭的博文

热门文章

  1. JAVA开发讲义(一)-Java的自白
  2. 初学者吉他怎么选?适合男女生新手吉他入门品牌推荐!
  3. Android Studio修改工程项目名称以及修改包名
  4. 11111122266666
  5. Node.js 第一天
  6. linux怎么随机生成数字,详解Linux如何生成随机数字和字符串
  7. 【Romance of the Three Kingdoms】
  8. flvplayer.swf flv视频播放器使用方法
  9. 服务器端获取签名直传OOS
  10. 基于知识图谱的知识推理