• TableStore最佳实践:GEO索引打造店铺搜索系统


    摘要: 如何使用TableStore打造店铺搜索系统

    一、方案背景

    对于一套GEO管理系统,其核心点与瓶颈在于数据库的存储性能与查询能力;一方面,存储服务需要应对海量数据的低延迟存、读,另一方面,存储服务也要提供高效的GEO+多维度数据检索。表格存储(TableStore),作为一款Serverless分布式NoSQL数据库,完全具备该系统的需求。
    下面我们将基于TableStore打造一个【亿量级GEO管理系统】;

    需求场景

    某店铺搜索平台,提供了亿量级的店铺信息。用户通过平台提供的PC端、移动端网页,按照自己的需求维度组合,搜索用户心仪的店铺。平台需要在地图上展示店铺的具体位置、店铺详细信息、店铺主页的跳转;
    维度一:【距离1km内】【人均100以内】【评分最高】【奶茶店】;
    维度二:【杭州市内】【评分最高的】【沈家*】店铺;
    ......
    实现快速、多维GEO查询功能,是GEO管理解决方案的核心功能,样例如下:
    注:该样例提供了【亿量级】店铺数据。官网控制台样例地址:项目样例

    testGeo

    基于表格存储搭建的店铺搜索系统页面一览,样例内嵌在表格存储控制台中,用户可登录控制台体验系统(若为表格存储的新用户,需要点击开通服务后体验,开通免费,订单数据存储在公共实例中,体验不消耗用户存储、流量、Cu)。

    表格存储(TableStore)方案

    使用表格存储(TableStore)研发的多元索引(SearchIndex)方案,可以轻松搭建一套:亿量级店铺搜索系统。多元索引功能可以创建GEO索引、分词字符串索引等,为用户提供了GEO检索、多维组合检索等能力,用户可随时创建,存量、增量数据自动同步。
    TableStore作为阿里云提供的一款全托管、零运维的分布式NoSql型数据存储服务,具有【海量数据存储】、【热点数据自动分片】、【海量数据多维检索】等功能,有效的地解决了GEO数据量大膨胀这一挑战;
    用户可以仅在需要的时候创建、开通索引。由TableStore来保证数据同步的一致性,这极大的降低了用户的方案设计、服务运维、代码开发等工作量。

    二、搭建准备

    若您对于基于TableStore实现的【亿量级店铺搜索系统】体验不错,并希望开始自己系统的搭建之旅,只需按照如下步骤便可以着手搭建了:

    1、开通表格存储

    通过控制台开通表格存储服务,表格存储即开即用(后付费),采用按量付费方式,已为用户提供足够功能测试的免费额度。表格存储官网控制台免费额度说明

    2、创建实例

    通过控制台创建表格存储实例,选择支持多元索引的Region。(当前阶段SearchIndex功能尚未商业化,暂时开放北京,上海,杭州和深圳四地,其余地区将逐渐开放)

    image | left

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

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

    image | left

    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

    列名数据类型索引类型字段说明
    _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直接创建):

    image.png | left | 827x351

    2、创建数据表索引

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

    image.png | left | 827x444

    image.png | left | 827x266

    3、数据导入

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

    image.png | left | 747x156

    店铺编号店铺(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);

     

    阅读原文​​​​​​​

  • 相关阅读:
    设置数据库某字段为当前时间
    HashMap源码解析(只为吊打面试官)
    SRAM 静态内存芯片 IS62WV51216 的使用 STM32F407ZGT6
    手机ARM种类,STM32中的ARM核又是什么东东?
    运算放大器 常用经典电路 计算书
    SMT 生产线设备 (PCBA)
    横机 电控设计
    ISO26262 标准
    质量管理体系(16949)的五大工具
    IATF16949和TS16949有什么不同?
  • 原文地址:https://www.cnblogs.com/zhaowei121/p/10020890.html
Copyright © 2020-2023  润新知