背景

作为面向大数据场景的半结构化、结构化存储系统,Lindorm已经在阿里发展了近十年,并始终保持着快速的能力更新和技术升级,其在功能、性能、稳定性等方面的诸多创新历经了长时间的大规模实践考验,被全面应用于阿里集团、蚂蚁集团、菜鸟、大文娱等各个业务板块,成为目前为止公司内部数据体量最大、覆盖业务最广的数据库产品。

Lindorm作为云原生多模数据库,目前支持宽表、时序、搜索、文件等多种数据模型,各模型间数据互融互通,一处写入处处可读,以适应用户在不同场景下的需求,使应用开发变得更加敏捷、高效。更全面的Lindorm介绍,可参考:存的起,看得见—云原生多模数据库Lindorm技术解析。

Lindorm一直致力于"让企业数据存的起,看得见",除了提供海量数据的低成本冷热存储,Lindorm也提供了丰富的索引支持,让数据能够实时可见,接下来我们将讲述Lindorm为满足企业客户的多样化查询需求而开放的全文索引功能。

数据查询的痛点

Lindorm Table引擎兼容HBase、Phoenix(SQL)、Cassandra(CQL)等开源标准接口,它的数据模型是一种松散的宽表结构,通过唯一键Rowkey确定一条数据,并且支持多个列族,每个列族的多个列集中存储。这样的数据模型,适合的查询场景主要有两种:
1.主键查询

SELECT * FROM table WHERE PK = ?;

2.前缀范围查询

SELECT * FROM table WHERE PK >= ? AND PK <= ? LIMIT 10;

而面对非主键条件的查询,一种方式是通过扫描主表来过滤出需要的数据,这会耗费过多的服务资源,造成系统的不稳定,另外一种方式是通过双写来维护多张表,但这会增加应用开发的复杂性,并且无法保证数据的一致性和写入效率。为此,Lindorm提供了强一致的全局二级索引,目前已经广泛应用在各个业务场景中。

除了这些通用查询外,随着业务发展,更多的查询需求随之而来:

  • 随机多维查询

  • 通配符模糊查询

  • 文本检索

  • 排序统计

  • 深度翻页

  • ......

主键查询和二级索引已经无法满足这样的需求,那如何在原有数据库基础上支撑这些需求呢?

业界数据库在面对这样的问题时,通常有两种做法:
1.DB内核内置搜索引擎(Lucene),提供全文索引能力。例如:MongoDB Atlas Search,Couchbase Search等。

2.DB+独立的搜索引擎,两个系统相互融合提供全文索引的能力。例如:AWS的DynamoDB与CloudSearch,Azure的ComosDB与Search,Greenplum GPText,以及Datastax推出的Cassandra Search。

Lindorm作为一款多模数据库,支持宽表、时序、搜索、文件四种模型,模型之间数据相互贯通,借助搜索引擎可以天然为宽表提供全文索引的能力,这也与业界的通用实现不谋而合。

全文索引示例

针对上面的表数据,我们可以对表中的多个列建立一个全文索引:姓名(name)、年龄(age)、性别(sex)、城市(city)、地址(address)。

CREATE SEARCH INDEX index_name ON table_name WITH COLUMNS name, age, sex, city, address(text);

创建完索引后,可以同时支持下面的多种查询需求:

模糊查询:SELECT * FROM table_name WHERE name LIKE ‘小%’
多维查询排序:SELECT * FROM table_name WHERE city='杭州' AND age>=18 ORDER BY age ASC
多维查询翻页:SELECT * FROM table_name WHERE name='小刘' AND sex=false OFFSET 100 LIMIT 10 ORDER BY age DESC
文本检索:SELECT * FROM table_name WHERE address CONTAINS ‘西湖区’

技术实现与功能介绍

Lindorm Search 搜索引擎

Lindorm搜索引擎是面向海量数据设计的分布式系统,兼容开源Solr标准接口,同时可无缝作为宽表、时序引擎的索引存储,加速检索查询。其整体架构与宽表引擎一致,基于数据自动分区+分区多副本+Lucene的结构设计,具备全文检索、聚合计算、复杂多维查询等能力,支持水平扩展、一写多读、跨机房容灾、TTL等,满足海量数据下的高效检索需求。

LindormSearch的数据持久化存储在LindormStore中,通过自动Sharding的方式分散到多台SearchServer中,每一个分片拥有多个副本,支持一写多读,提升查询聚合的效率,同时这些副本之间共享存储,有效消除副本之间的存储冗余。

宽表与搜索的融合

通过融合搜索引擎,借助Lucene的倒排索引和列式存储能力,我们为宽表提供了全文索引功能,在使用体验上类似二级索引,同时有更为丰富的语法支持,例如:分词、高亮、统计聚合等。

CQL访问

CQL全称Cassandra Query Language,是Cassandra社区提供的一套类SQL语言,熟悉SQL操作的开发人员可以很轻松的使用CQL。除了原生API访问全文索引外,Lindorm同样也提供CQL访问全文索引的能力,借助CQL可以实现对索引的管理操作,通过DML语句可以实现对宽表数据的读写,内部会自动路由到全文索引。

典型场景

全文索引提供丰富的查询能力,配合宽表引擎,可以广泛应用在移动出行、电商/网站、系统分析、时空时序场景。

案例一:订单详情

案例二:用户画像

最后

体验全文索引,请参考指导文档:Lindorm全文索引,更多的技术交流,可以通过钉钉扫描二维码入群,可参考专家服务。



©著作权归作者所有:来自51CTO博客作者mb5fdb0a6739180的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. JavaEE在线就业班2.0【最新升级版】
  2. GO进阶训练营
  3. [go-linq]-Go的.NET LINQ式查询方法
  4. Hudi原理 | 在Apache Hudi中为快速更删配置合适的索引原创
  5. 数据湖风暴来袭,EMR重磅发布Apache Hudi
  6. Oracle索引整理
  7. flea-frame-db使用之JPA接入
  8. python起步学习(三)
  9. flea-frame-db使用之JPA封装介绍

随机推荐

  1. Android(安卓)创建自定Dialog
  2. SSDP协议的Android实现以及使用
  3. 用Eneter实现Android与.NET间通讯
  4. 活动与任务
  5. 打造android ORM框架opendroid(四)——优
  6. PHP android ios相互兼容的AES加密算法
  7. Android界面加载完成后自动弹出软键盘的
  8. 快速体验Android(安卓)2.3
  9. android map的使用方法
  10. Android打包jar 和使用第三方库