电子说
今天,华为云GaussDB(for Cassandra)携__Lucene引擎全新解决方案__来啦!
当前,互联网、大数据飞速发展,数据量呈爆发式增长,在高并发、高可用、高扩展性的业务需求推动下,NoSQL数据库成为了越来越多场景的刚需。但在查询方面,传统的NoSQL却有一定的局限性,严格来说,像开源MongoDB、Cassandra、Hbase等都不具备海量数据的多维查询、文本检索、统计分析等能力。多数企业仍然在寻求一套更完美的NoSQL解决方案。
华为云原生多模数据库GaussDB NoSQL拥有强大的生态体系,支持键值、宽表、文档、时序四种引擎接口。其中,宽表引擎接口GaussDB(for Cassandra)现已发布Lucene二级索引功能,既具备NoSQL的优势,又能支持多种复杂查询场景,全面提升用户在海量数据场景下的查询体验,凭实力宠粉!相信大家一定有很多疑问,GaussDB(for Cassandra)是什么?二级索引如何使用?Lucene二级索引又有哪些区别?别着急,接下来让我们一一解读。
GaussDB(for Cassandra)是一款基于华为自研、采用计算存储分离架构的分布式云数据库,在高性能、高可用、高可靠、高安全、可弹性伸缩的基础上,提供了一键部署、备份恢复、监控报警等服务能力;并高度兼容开源Cassandra接口,提供高读写性能。当前已经广泛应用于IoT、气象、互联网、游戏等诸多领域。
我们先来了解下索引的概念。索引是为了加快数据检索速度而创建的一种存储结构,是一种以空间换时间的设计思想。作用可以理解为书的目录,通过目录可快速定位到所需要的内容。
在Cassandra中,Primary Key就是索引(也被称为一级索引),在查询的时候,根据Primary Key可以直接检索到对应的记录。而二级索引又称辅助索引,是为了帮助定位到一级索引,然后再根据一级索引找到对应记录。我们平时使用CREATE INDEX语句建立的就是二级索引。
原生Cassandra中二级索引的实现其实是创建了一张隐式的表,该表的Primary Key是创建索引的列,值为对应的Primary Key,实现相对简单,因此不可避免地带来了一些约束条件:
1.第一主键只能用“=”查询;
2.第二主键可以使用“=、>、<、>=、<=”;
3.索引列只支持“=”查询;
4.删除、更新太过频繁的列不适合建立索引;
5.High-cardinality列不适合做索引;
基于以上约束,Cassandra二级索引能提供的查询功能非常有限。
Lucene是当下最火的开源全文检索引擎工具,具有以下特点:
1.稳定、索引性能高;
2.是高效、准确、高性能的搜索算法;
3.具备丰富的查询类型:支持短语查询、通配符查询、近似查询、范围查询等;
4.有强大的开源社区支持,可维护性好;
因此,用集成Lucene引擎来补充Cassandra查询能力的弱点是最佳选择,毕竟谁又会拒绝一款性能稳定、持续成长、又更新迭代的搜索引擎呢?
Lucene引擎强大的倒排索引和列式存储能力,赋予了GaussDB(for Cassandra)高效的多维查询、文本检索、统计分析等能力,在使用体验上和原生二级索引相似,但同时拥有了更为丰富的语法支持。
所有查询均可不带PK或者带部分PK,并且索引列支持 “>、<、in”等操作符,用户不需要再局限于只使用“=”。
文本检索能力正是Lucene最擅长的,使用起来十分方便,只需要通过关键词like即可实现。
你可以这样:
SELECT \\* FROM example WHERE field LIKE 'test%'; // 前缀查询
也可以这样:
SELECT \\* FROM example WHERE field LIKE 'start\\*end'; // 正则匹配
还可以这样:
SELECT \\* FROM example WHERE field LIKE '%\\+lucene \\+index%'; // 全文搜索功能,性能高效,稳定
SELECT count\\(\\*\\) FROM example WHERE field1>\\-1 AND EXPR\\(field2, 'count'\\);
支持single单行删除、partition分区删除、range范围删除,全方位覆盖各种删除场景。
DELETE FROM example WHERE pk1='a' AND field=1; // single单行删除
DELETE FROM example WHERE pk1='a' AND pk2=5000; // partition分区删除
DELETE FROM example WHERE pk1='a' AND pk2=3000 AND ck1=2 AND ck2>'a' AND ck2<'c'; // range范围删除
扩展的json查询接口提供了丰富的查询语法,用法更多样化。以下是关键字列表:
filter
在查询语句中json查询的关键字
term
查询时判断某个document是否包含某个具体的值,不会对被查询的值进行分词查询
match
将被询值进行分词,进行全文检索
range
查询指定某个字段在某个特定的范围(范围查询子关键字:"eq"/"gte"/"gt"/"lte"/"lt")
bool
必须和 "must"、"should"、"must not" 一起组合出复杂的查询
must
bool类型的子查询,类型为list,封装"term"、"match"、"range" 查询
should
bool类型的子查询,类型为list,封装"term"、"match"、"range" 查询
must not
bool类型的子查询,类型为list,封装"term"、"match"、"range" 查询
举个栗子:
SELECT \\* FROM example WHERE EXPR\\(index\\_field, '\\{"filter": \\{"bool": \\{"should": \\[\\{"bool": \\{"should": \\[\\{"bool": \\{"must": \\[\\{"bool": \\{"should": \\[\\{"range": \\{"ck1": \\{"lt": 2\\}, "ck1": \\{"gte": 4\\}\\}\\}\\]\\}\\}, \\{"bool": \\{"should": \\[\\{"range": \\{"field1": \\{"lt": 2\\}, "field1": \\{"gt": 3\\}\\}\\}\\]\\}\\}\\]\\}\\}, \\{"bool": \\{"should": \\[\\{"term": \\{"pk1": "a", "pk1": "b", "pk1": "c"\\}\\}\\]\\}\\}\\]\\}\\}, \\{"bool": \\{"must": \\[\\{"range": \\{"field2": \\{"gte":5, "lte": 15\\}, "pk2": \\{"gt": 2000\\}\\}\\}\\]\\}\\}\\]\\}\\}\\}'\\)
通过条件组合加嵌套,您可以DIY符合自身业务的sql语句,并且最高支持200层json嵌套,再复杂的场景也能处理!
华为云GaussDB(for Cassandra)搭载Lucene引擎,通过Lucene二级索引将搜索能力下沉至底层,从根本上解放了应用层查询,兼具多维查询、文本检索、统计分析等多种能力,可以完美地弥补NoSql弱查询功能的短板,让企业从容应对海量数据的复杂查询场景。还等什么,速来体验吧!
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !