《TableStore最佳實踐:GEO索引打造店鋪搜索系統》

摘要: 如何使用TableStore打造店鋪搜索系統html

1、方案背景

對於一套GEO管理系統,其核心點與瓶頸在於數據庫的存儲性能與查詢能力;一方面,存儲服務須要應對海量數據的低延遲存、讀,另外一方面,存儲服務也要提供高效的GEO+多維度數據檢索。表格存儲(TableStore),做爲一款Serverless分佈式NoSQL數據庫,徹底具有該系統的需求。
下面咱們將基於TableStore打造一個【億量級GEO管理系統】;java

需求場景

某店鋪搜索平臺,提供了億量級的店鋪信息。用戶經過平臺提供的PC端、移動端網頁,按照本身的需求維度組合,搜索用戶心儀的店鋪。平臺須要在地圖上展現店鋪的具體位置、店鋪詳細信息、店鋪主頁的跳轉;
維度一:【距離1km內】【人均100之內】【評分最高】【奶茶店】;
維度二:【杭州市內】【評分最高的】【沈家*】店鋪;
......
實現快速、多維GEO查詢功能,是GEO管理解決方案的核心功能,樣例以下:
注:該樣例提供了【億量級】店鋪數據。官網控制檯樣例地址:項目樣例node

testGeo

基於表格存儲搭建的店鋪搜索系統頁面一覽,樣例內嵌在表格存儲控制檯中,用戶可登陸控制檯體驗系統(若爲表格存儲的新用戶,須要點擊開通服務後體驗,開通免費,訂單數據存儲在公共實例中,體驗不消耗用戶存儲、流量、Cu)。git

表格存儲(TableStore)方案

使用表格存儲(TableStore)研發的多元索引(SearchIndex)方案,能夠輕鬆搭建一套:億量級店鋪搜索系統。多元索引功能能夠建立GEO索引、分詞字符串索引等,爲用戶提供了GEO檢索、多維組合檢索等能力,用戶可隨時建立,存量、增量數據自動同步。
TableStore做爲阿里雲提供的一款全託管、零運維的分佈式NoSql型數據存儲服務,具備【海量數據存儲】、【熱點數據自動分片】、【海量數據多維檢索】等功能,有效的地解決了GEO數據量大膨脹這一挑戰;
用戶能夠僅在須要的時候建立、開通索引。由TableStore來保證數據同步的一致性,這極大的下降了用戶的方案設計、服務運維、代碼開發等工做量。github

2、搭建準備

若您對於基於TableStore實現的【億量級店鋪搜索系統】體驗不錯,並但願開始本身系統的搭建之旅,只需按照以下步驟即可以着手搭建了:數據庫

一、開通表格存儲

經過控制檯開通表格存儲服務,表格存儲即開即用(後付費),採用按量付費方式,已爲用戶提供足夠功能測試的免費額度。表格存儲官網控制檯免費額度說明less

二、建立實例

經過控制檯建立表格存儲實例,選擇支持多元索引的Region。(當前階段SearchIndex功能還沒有商業化,暫時開放北京,上海,杭州和深圳四地,其他地區將逐漸開放)運維

image | left

建立實例後,提交工單申請多元索引功能邀測(商業化後默認打開,不使用不收費)。分佈式

  • 邀測地址:提工單,選擇【表格存儲】>【產品功能、特性諮詢】>【建立工單】,申請內容以下:
  • 問題描述:請填寫【申請SearchIndex邀測】
  • 機密信息:請填寫【地域+實例名】,例:上海+myInstanceName

image | left

三、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

四、表設計

店鋪檢索系統樣例,僅簡易使用一張店鋪表,主要包含字段:店鋪類型、店鋪名稱、店鋪地理位置、店鋪平均評分、人均消費消等。表設計以下:
表名: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 評分
... ... ... ...

3、開始搭建(核心代碼)

一、建立數據表

用戶僅需在完成邀測的實例下建立「店鋪信息表」:經過控制檯建立、管理數據表(用戶也能夠經過SDK直接建立):

image.png | left | 827x351

二、建立數據表索引

TableStore自動作全量、增量的索引數據同步:用戶能夠經過控制檯建立索引、管理索引(也能夠經過SDK建立索引)

image.png | left | 827x444

image.png | left | 827x266

三、數據導入

插入測試數據(控制檯樣例中插入了1億條數據,用戶本身能夠插入少許測試數據);

image.png | left | 747x156

店鋪編號 店鋪(md5)(主鍵) 類型 店鋪名稱 店鋪位置 店鋪評分 人均消費    
o0057022192 0000000f470ef0f548b925ceffe1a7e3 杭幫菜 韓村杭幫菜 36.76613,111.41461 2.87 63.67    

四、數據讀取

數據讀取分爲兩類:

主鍵讀取

基於原生表格存儲的主鍵列獲取: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);

做者: 潭潭
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索