《tablestore最佳实践:geo索引打造店铺搜索系统》

author author     2023-01-26     499

关键词:

一、方案背景
对于一套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功能尚未商业化,暂时开放北京,上海,杭州和深圳四地,其余地区将逐渐开放)

技术分享图片

创建实例后,提交工单申请多元索引功能邀测(商业化后默认打开,不使用不收费)。

邀测地址:提工单,选择【表格存储】>【产品功能、特性咨询】>【创建工单】,申请内容如下:
问题描述:请填写【申请SearchIndex邀测】
机密信息:请填写【地域+实例名】,例:上海+myInstanceName
技术分享图片

3、SDK下载
使用具有多元索引(SearchIndex)的SDK,官网地址,暂时java、go、node.js三种SDK增加了新功能

java-SDK
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore</artifactId>
<version>4.7.4</version>
</dependency>
go-SDK
$ go get github.com/aliyun/aliyun-tablestore-go-sdk
4、表设计
店铺检索系统样例,仅简易使用一张店铺表,主要包含字段:店铺类型、店铺名称、店铺地理位置、店铺平均评分、人均消费消等。表设计如下:
表名:geo_positon
技术分享图片
三、开始搭建(核心代码)
1、创建数据表
用户仅需在完成邀测的实例下创建“店铺信息表”:通过控制台创建、管理数据表(用户也可以通过SDK直接创建):

技术分享图片

2、创建数据表索引
TableStore自动做全量、增量的索引数据同步:用户可以通过控制台创建索引、管理索引(也可以通过SDK创建索引)

技术分享图片

技术分享图片

3、数据导入
插入测试数据(控制台样例中插入了1亿条数据,用户自己可以插入少量测试数据);

技术分享图片

技术分享图片
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)对于轨迹管理场景,依然可以胜任,完全具备实现轨迹管理系统的能 查看详情

MySQL 索引 - 最佳实践是啥?

】MySQL索引-最佳实践是啥?【英文标题】:MySQLindexes-whatarethebestpractices?MySQL索引-最佳实践是什么?【发布时间】:2010-06-1521:39:07【问题描述】:我已经在我的MySQL数据库上使用索引有一段时间了,但从未正确了解它们。通常,我... 查看详情

索引最佳实践

索引最佳实践在使用索引时,我们可以通过explain+extended查看SQL的执行计划,判断是否使用了索引以及发生了隐式转换。由于常见的隐式转换是由字段数据类型以及collation定义不当导致,因此我们在设计开发阶段,要避免数据库... 查看详情

最佳实践|助您轻松打造优秀android应用

对于开发团队而言,优秀的应用体验至关重要。实际上,在GooglePlay上对Android应用给出五星好评的用户中,近四分之三提到了自己的应用体验感受*以及应用的速度、设计还有易用性。在Google,我们希望帮助所有开... 查看详情

最佳实践|助您轻松打造优秀android应用

对于开发团队而言,优秀的应用体验至关重要。实际上,在GooglePlay上对Android应用给出五星好评的用户中,近四分之三提到了自己的应用体验感受*以及应用的速度、设计还有易用性。在Google,我们希望帮助所有开... 查看详情

coding携手优普丰,道器合璧打造敏捷最佳实践

随着全球进入到信息化时代,越来越多的企业迫切地寻求新的商业模式,要求迭代、探索、不断加速创新以响应快速变化的市场。如今一系列新兴概念如敏捷开发、极限编程、微服务、自动化、DevOps等大行其道,然而面对互联网... 查看详情

Opensearch - 索引的最佳实践

】Opensearch-索引的最佳实践【英文标题】:Opensearch-bestpracticeforindexing【发布时间】:2022-01-2221:34:08【问题描述】:我有大约1TB的旧apache日志数据,我想在Opensearch中建立索引。日志是每天的,结构如下:s3://bucket/logdata/year/year_month... 查看详情

MATLAB for 循环索引的最佳实践

】MATLABfor循环索引的最佳实践【英文标题】:BestpracticeforMATLABforloopindex【发布时间】:2013-04-1004:36:37【问题描述】:我惊讶地发现运行MATLABfor循环之间的成本差异如下:ksize=100;klist=1:ksize;ticform=1:100000fork=1:ksizeendendtocticform=1:100000f... 查看详情

grails 索引页面的最佳实践

】grails索引页面的最佳实践【英文标题】:Bestpracticesforgrailsindexpage【发布时间】:2010-09-1623:16:21【问题描述】:在grails应用程序中为索引页面填充模型的正确方法是什么?默认情况下没有IndexController,是否有其他机制可以将这... 查看详情

一朵云一张网一体化——grtn打造最佳流媒体场景实践

...云资深技术专家卢日发表了题为《GRTN打造阿里云边缘云最佳流媒体场景实践》的精彩演讲。卢日分享了他对分布式云的见解,他表示,Gartner连续两年将分布式云列为全球10大最顶级技术趋势 查看详情

Mysql 索引:查询生成器的最佳实践

】Mysql索引:查询生成器的最佳实践【英文标题】:Mysqlindexing:bestpracticeswhithquerybuilder【发布时间】:2021-08-3009:19:13【问题描述】:我们有包含数百万数据的表格。我们打算在此表上创建索引以优化搜索。这里的问题是这个表上... 查看详情

阿里云卢日:grtn打造阿里云边缘云最佳流媒体场景实践

...云资深技术专家卢日发表了题为《GRTN打造阿里云边缘云最佳流媒体场景实践》的精彩演讲。卢日首先分享了他对分布式云的见解,他表示,Gartner连续两年将分布式云列为全球10大最顶级技术趋势,并预测到2025年超过5... 查看详情

阿里云卢日:grtn打造阿里云边缘云最佳流媒体场景实践

...云资深技术专家卢日发表了题为《GRTN打造阿里云边缘云最佳流媒体场景实践》的精彩演讲。卢日首先分享了他对分布式云的见解,他表示,Gartner连续两年将分布式云列为全球10大最顶级技术趋势,并预测到2025年超过5... 查看详情

一朵云一张网一体化——grtn打造最佳流媒体场景实践

...云资深技术专家卢日发表了题为《GRTN打造阿里云边缘云最佳流媒体场景实践》的精彩演讲。卢日分享了他对分布式云的见解,他表示,Gartner连续两 查看详情

SQL Server 索引最佳实践(SQL Server 2008)[关闭]

】SQLServer索引最佳实践(SQLServer2008)[关闭]【英文标题】:SQLServerIndexingbestpractice(SQLServer2008)[closed]【发布时间】:2014-02-1107:54:42【问题描述】:我对选择正确的索引有一些疑问并有一些疑问:聚集索引什么是最好的候选人?通... 查看详情

确保 Solr/Lucene 索引在长时间重建后“最新”的最佳实践

】确保Solr/Lucene索引在长时间重建后“最新”的最佳实践【英文标题】:BestpracticeforensuringSolr/Luceneindexis"uptodate"afterlongrebuild【发布时间】:2011-05-0215:38:16【问题描述】:我们有一个关于长期索引重建期间的最佳实践/编程... 查看详情

创建数据库索引都有哪些最佳实践和“经验法则”?

】创建数据库索引都有哪些最佳实践和“经验法则”?【英文标题】:Whataresomebestpracticesand"rulesofthumb"forcreatingdatabaseindexes?创建数据库索引有哪些最佳实践和“经验法则”?【发布时间】:2010-10-1520:05:36【问题描述】:我... 查看详情

存储和索引 1M+ XML 文档的最佳实践?

】存储和索引1M+XML文档的最佳实践?【英文标题】:Bestpracticeforstoringandindexing1M+XMLdocuments?【发布时间】:2016-07-0318:06:31【问题描述】:我有一个存档了几年的XML文档。有100万多个独特的文档主题,每个主题在任何给定年份都可... 查看详情