基于Tablestore多元索引打造亿量级店铺搜索系统
一、方案背景
对于一套GEO管理系统,其核心点与瓶颈在于数据库的存储性能与查询能力;一方面,存储服务需要应对海量数据的低延迟存、读,另一方面,存储服务也要提供高效的GEO+多维度数据检索。表格存储(TableStore),作为一款Serverless分布式NoSQL数据库,完全具备该系统的需求。
下面我们将基于TableStore打造一个【亿量级GEO管理系统】;
需求场景
某店铺搜索平台,提供了亿量级的店铺信息。用户通过平台提供的PC端、移动端网页,按照自己的需求维度组合,搜索用户心仪的店铺。平台需要在地图上展示店铺的具体位置、店铺详细信息、店铺主页的跳转;
维度一:【距离1km内】【人均100以内】【评分最高】【奶茶店】;
维度二:【杭州市内】【评分最高的】【沈家*】店铺;
......
实现快速、多维GEO查询功能,是GEO管理解决方案的核心功能,样例如下:
注:该样例提供了【亿量级】店铺数据。
基于表格存储搭建的店铺搜索系统页面一览,样例内嵌在表格存储控制台中,用户可登录控制台体验系统(若为表格存储的新用户,需要点击开通服务后体验,开通免费,订单数据存储在公共实例中,体验不消耗用户存储、流量、Cu)。
表格存储(TableStore)方案
使用表格存储(TableStore)研发的多元索引(SearchIndex)方案,可以轻松搭建一套:亿量级店铺搜索系统。多元索引功能可以创建GEO索引、分词字符串索引等,为用户提供了GEO检索、多维组合检索等能力,用户可随时创建,存量、增量数据自动同步。
TableStore作为阿里云提供的一款全托管、零运维的分布式NoSql型数据存储服务,具有【海量数据存储】、【热点数据自动分片】、【海量数据多维检索】等功能,有效的地解决了GEO数据量大膨胀这一挑战;
用户可以仅在需要的时候创建、开通索引。由TableStore来保证数据同步的一致性,这极大的降低了用户的方案设计、服务运维、代码开发等工作量。
二、搭建准备
若您对于基于TableStore实现的【亿量级店铺搜索系统】体验不错,并希望开始自己系统的搭建之旅,只需按照如下步骤便可以着手搭建了:
1、开通表格存储
通过控制台开通表格存储服务,表格存储即开即用(后付费),采用按量付费方式,已为用户提供足够功能测试的免费额度。
2、创建实例
通过控制台创建表格存储实例,选择支持多元索引的Region。(当前阶段SearchIndex功能尚未商业化,暂时开放北京,上海,杭州和深圳四地,其余地区将逐渐开放)
创建实例后,提交工单申请多元索引功能邀测(现多元索引功能已商业化,无需申请)。
3、SDK下载
使用具有多元索引(SearchIndex)的SDK,官网地址,暂时java、go、node.js三种SDK增加了新功能
java-SDK
<dependency><groupId>com.aliyun.openservices</groupId><artifactId>tablestore</artifactId><version>4.8.0</version>
</dependency>
go-SDK
$ go get github.com/aliyun/aliyun-tablestore-go-sdk
Nodejs-SDK
$ npm install tablestore@4.1.0
4、表设计
店铺检索系统样例,仅简易使用一张店铺表,主要包含字段:店铺类型、店铺名称、店铺地理位置、店铺平均评分、人均消费消等。表设计如下:
表名:geo_positon
列名 | 数据类型 | 索引类型 | 字段说明 |
---|---|---|---|
_id(主键列) | String | MD5(pId)避免热点 | |
pId | Stirng | 店铺编号 | |
type | String | KEYWORD | 类型 |
name | String | TEXT | 店铺名,TEXT类型索引可模糊查询,但不能排序 |
pos | String | GEO_POINT | 店铺位置:"30.132,120.082"(纬度,精度) |
point | double | DOUBLE | 评分 |
... | ... | ... | ... |
三、开始搭建(核心代码)
1、创建数据表
用户仅需在完成邀测的实例下创建“店铺信息表”:通过控制台创建、管理数据表(用户也可以通过SDK直接创建):
2、创建数据表索引
TableStore自动做全量、增量的索引数据同步:用户可以通过控制台创建索引、管理索引(也可以通过SDK创建索引)
3、数据导入
插入测试数据(控制台样例中插入了1亿条数据,用户自己可以插入少量测试数据);
店铺编号 | 店铺(md5)(主键) | 类型 | 店铺名称 | 店铺位置 | 店铺评分 | 人均消费 | ||
---|---|---|---|---|---|---|---|---|
o0057022192 | 0000000f470ef0f548b925ceffe1a7e3 | 杭帮菜 | 韩村杭帮菜 | 36.76613,111.41461 | 2.87 | 63.67 |
4、数据读取
数据读取分为两类:
主键读取
基于原生表格存储的主键列获取:getRow, getRange, batchGetRow等。主键读取用于索引(自动)反查,用户也可以提供主键(订单md5)的单条查询的页面,亿量级下查询速度极快。单主键查询方式不支持多维度检索;
索引读取(店铺查询)
基于新SearchIndex功能Query:search接口。用户可以自由设计索引字段的多维度条件组合查询。通过设置选择不同的查询参数,构建不同的查询条件、不同排序方式;目前支持:精确查询、范围查询、前缀查询、匹配查询、通配符查询、短语匹配查询、分词字符串查询,并通过布尔与、或组合。
如【"36.76613,111.41461"周边1km米范围内的奶茶店】,查询条件如下:
List<Query> mustQueries = new ArrayList<Query>();TermQuery termQuery = new TermQuery();
termQuery.setFieldName("type");
termQuery.setTerm(ColumnValue.fromString(奶茶));
mustQueries.add(termQuery);GeoDistanceQuery geoDistanceQuery = new GeoDistanceQuery();
geoDistanceQuery.setFieldName("pos");
geoDistanceQuery.setCenterPoint("36.76613,111.41461");
geoDistanceQuery.setDistanceInMeter(1000);
mustQueries.add(geoDistanceQuery);BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(mustQueries);
原文链接
本文为云栖社区原创内容,未经允许不得转载。
基于Tablestore多元索引打造亿量级店铺搜索系统相关推荐
- 《TableStore最佳实践:GEO索引打造店铺搜索系统》
一.方案背景 对于一套GEO管理系统,其核心点与瓶颈在于数据库的存储性能与查询能力:一方面,存储服务需要应对海量数据的低延迟存.读,另一方面,存储服务也要提供高效的GEO+多维度数据检索.表格存储(T ...
- 亿级人脸搜索系统,数据为一亿一千多万的测试地址https://face.z2lab.com/
亿级人脸搜索系统https://face.z2lab.com/ 亿级人脸搜索系统,在111126799 张人脸下,检索时间在300毫秒左右. https://face.z2lab.com/
- 基于SpringBoot+Vue20小时打造高考志愿填报辅助系统
目录 一.构思网站:1小时 二.设计数据库:3小时 三.设计原型:1小时 四.前端代码实现:5小时 五.后端代码实现:4小时 六.前后端交互:6小时 七.源码下载 一.构思网站:1小时 目标:构思网站 ...
- TableStore发布多元索引功能,打造统一的在线数据平台
什么是NoSQL "NoSQL"一词最早出现在1998年,距今刚好二十年.站在今天回头看的话,很少有人能想到在关系型数据库成熟发展了三十年,已经在数据存储领域占据了不可动摇的的地位 ...
- 基于TableStore的亿级订单管理解决方案
一.方案背景 订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的 ...
- 基于Tablestore的Wifi设备监管系统架构实现
Wifi设备监管 某知名跨国公司,在全球范围内拥有大量园区,园区内会有不同部门的同事在一起办公.每个园区内都要配备大量的Wifi设备从而为园区同事提供方便的上网服务.因此,集团需要一套完善的监管系统维 ...
- 基于Tablestore管理海量快递轨迹数据架构实现
快递轨迹管理 对于一个快递公司,在全国范围内有着大量的快递点.快递员.运输车辆以及仓储中心.而快递自产生后,就会在这些地点.人物之间流转.因而,一套完善的快递管理追踪系统是快递公司的重要管理工具: 用 ...
- 基于TableStore的海量电商订单元数据管理
一.背景 订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的重视 ...
- 基于Tablestore的Wifi设备监管系统架构实现 1
Wifi设备监管 某知名跨国公司,在全球范围内拥有大量园区,园区内会有不同部门的同事在一起办公.每个园区内都要配备大量的Wifi设备从而为园区同事提供方便的上网服务.因此,集团需要一套完善的监管系统维 ...
最新文章
- J2EE持久层持久化上下文传播总结(续)
- hdu5251最小矩形覆盖
- OpenCV检测拐角detecting corners的实例(附完整代码)
- java ssm 系统的搭建_SSM框架下的javaweb学生管理系统--搭建系统结构
- excel中如何动态地创建控件以显示查询结果_Excel催化剂开源第23波-VSTO开发辅助录入功能...
- Flash of Unstyled Content (FOUC)
- 巴士电台开放接口API
- 搭建10分钟,解决90%问题,帕累托分析模型为何这么强?
- HoverTree开发日志之验证码
- 4-1 ADO.NET简介 4
- 如何在 Linux 上检查可用磁盘空间 [终端和 GUI]
- Smack Extensions用户手册
- 设置角速度及生成四元数及利用刚体
- js实现word生成书签_javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印...
- 联通计算机用户名和密码,终极:联通路由器的默认登录密码是什么?
- 绝绝子!京东大牛用一文将Python 接口自动化测试解析透彻的不行~
- Google测试工师的一道面试题目
- MySQL慢查询记录原理和内容解析
- 电压采样,输出有效值
- 使用第三方APPKey授权 跳转登录 QQ
热门文章
- update关联一个视图的时候特别慢_实现一个简单的Vue.js
- php入门和常用类的使用,php入门教程之常用数据类型和基本语法
- 【LeetCode笔记】226. 翻转二叉树(Java、递归)
- android 浮动按钮拖拽,小程序拖拽浮动按钮
- 9切换中文mac_超详细的Mac重装系统教程!让重装系统变得简单起来!
- python gridsearch_python gridsearch中的内存错误
- 6-7 使用函数输出水仙花数_学习C语言居然对printf函数不理解???
- yolo算法_不到2MB,超轻YOLO算法!准确率接近YOLOv3,速度快上45%
- 创建一个storageevent事件_谈谈StorageEvent
- html5写入唯一标识,id - 唯一标识符 - html5全局属性