在地图或地理信息有关的场景里,地址关键词的检索尤其重要。比如打开百度地图,想要查询某个位置的信息“北京市海淀区清华东路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 ,支持丰富的数据类型及地理信息扩展,具有强大的并行计算能力。支持备份、监控、迁移等全套解决方案。

作者:曲艺伟/彭智

京东云PostgreSQL在GIS场景的应用分享的更多相关文章

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

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

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

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

  3. 京东云罗玉杰:OpenResty 在直播场景中的应用

    2019 年 3 月 23 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·北京站,京东云技术专家罗玉杰在活动上做了< OpenResty ...

  4. 京东云、新浪微博等专家畅谈Docker未来格局:开放与竞争(下)

    在上次推送的文章中(传送门),田琪老师分享了他的DockerCon 2015峰会见闻.在“QCon高可用架构群”中,田老师分享之后,几位专家也参与了讨论.他们是: 闫国旗:京东资深架构师,京东架构技术 ...

  5. Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云!

    Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云! Chef.Puppet.Ansible.SaltStack 都可以称为配置管理工具,这些工具的主要目 ...

  6. 京东云与AI 10 篇论文被AAAI 2020 收录,京东科技实力亮相世界舞台

    美国时间2月7-12日,AAAI 2020大会在纽约正式拉开序幕,AAAI作为全球人工智能领域的顶级学术会议,每年评审并收录来自全球最顶尖的学术论文,这些学术研究引领着技术的趋势和未来.京东云与AI在 ...

  7. 利用京东云Serverless服务快速构建5G时代的IoT应用

    10月31日,在2019年中国国际信息通信展览会上,工信部宣布:5G商用正式启动.5G商用时代来了! 5G的商用,使得数据传输速度.响应速度.连接数据.数据传输量.传输可靠性等方面都有了显著的提升,这 ...

  8. 从单个系统到云翼一体化支撑,京东云DevOps推进中的一波三折

    作者:王利莹 采访嘉宾:京东云DevOps团队负责人 郑永宽 今年,IDC 特别针对中国地区发布了<IDC MarketScape:中国 DevOps 云市场2019,厂商评估>研究报告, ...

  9. 体验京东云 Serverless+AI 人脸属性识别

    云原生计算基金会CNCF(Cloud Native Computing Foundation, CNCF)Serverless Whitepaper v1.0对无服务器计算作了如下定义: Server ...

随机推荐

  1. 【Spring】事务的执行原理(二)

    前置知识 事务的执行步骤如下: 获取事务管理器 创建事务 执行目标方法 捕捉异常,如果出现异常进行回滚 提交事务 public abstract class TransactionAspectSupp ...

  2. Linux常用命令-软件包管理工具-rpm

    命令简介 rpm(RPM Package Manager)是一个强大的命令行驱动的软件包管理工具,用来安装.卸载.校验.查询和更新 Linux 系统上的软件包. 语法格式 rpm [OPTION... ...

  3. 【python基础】第03回 软件安装

    上节内容回顾 1.计算机五大组成部分详解 1.控制器 控制计算机各个硬件的工作 2.运算器 数学运算.逻辑运算(核心) """CPU = 控制器 + 运算器"& ...

  4. 深入解析kubernetes中的选举机制

    Overview 在 Kubernetes的 kube-controller-manager , kube-scheduler, 以及使用 Operator 的底层实现 controller-rumt ...

  5. 实现一个Prometheus exporter

    Prometheus 官方和社区提供了非常多的exporter,涵盖数据库.中间件.OS.存储.硬件设备等,具体可查看exporters.exporterhub.io,通过这些 exporter 基本 ...

  6. VM Ware 给Centos虚拟机配置静态IP

    前言:在大家的日常运维工作中,肯定多多少少都会用到虚拟机,但是默认情况下VMware创建的虚拟机每次启动都有可能更换IP这就对我们的工作造成了一定的麻烦,下面我就给大家介绍下,如何给centos虚拟机 ...

  7. SpringCloud Gateway微服务网关实战与源码分析-上

    概述 定义 Spring Cloud Gateway 官网地址 https://spring.io/projects/spring-cloud-gateway/ 最新版本3.1.3 Spring Cl ...

  8. Template -「整体二分」

    写的简单.主要是留给自己做复习资料. 「BZOJ1901」Dynamic Rankings. 给定一个含有 \(n\) 个数的序列 \(a_1,a_2 \dots a_n\),需要支持两种操作: Q ...

  9. isNotBlank()方法和isNotEmpty()方法的区别

  10. JUC源码学习笔记3——AQS等待队列和CyclicBarrier,BlockingQueue

    一丶Condition 1.概述 任何一个java对象都拥有一组定义在Object中的监视器方法--wait(),wait(long timeout),notify(),和notifyAll()方法, ...