- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
**摘要:**复杂查询so easy!GaussDB(for Cassandra)新特性来袭。
本文分享自华为云社区《来了!GaussDB(for Cassandra)新特性亮相》,作者:GaussDB 数据库 。
今天,华为云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 pk > 1 and expr(lucene_index, '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查询接口提供了丰富的查询语法,用法更多样化。以下是关键字列表:
举个栗子:
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弱查询功能的短板,让企业从容应对海量数据的复杂查询场景。还等什么,速来体验吧!
本文作者:华为云高斯Cassandra团队
更多技术文章,请关注高斯Cassandra官方博客:Cassandra官方的博客_云社区-华为云
我们有 2 个 cassandra 集群,第一个有旧数据,第二个有新数据。 现在我们想要将旧数据从第一个集群移动或复制到第二个集群。什么是最好的方法来做到这一点以及如何做到这一点? 我们正在使用 DS
我正在考虑安装 OpsCenter 来监控我们在 RackSpace VM 上运行的 24 节点 Cassandra 集群。过去我听说 OpsCenter 减慢了集群速度。我有点担心 OpsCente
假设我有一个复制因子(RF)= 2 的 2 节点集群。 我使用一致性 2 触发插入。当客户端等待响应时,Cassandra 开始写入这 2 个节点。中间一个节点失败,无法完成写入,而另一节点上的写入成
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足 Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以
我在 Cassandra 中有一个表,其中我用 1000 多个条目填充了一些行(每行有 10000 多列)。行中的条目更新非常频繁,基本上只是一个字段(它是一个整数)被更新为不同的值。列的所有其他值保
当Cassandra端有“掉落的突变”时,它是否向调用客户端返回相应的失败?或者即使在服务器端丢弃相应的突变并导致数据丢失,它总是成功响应调用事务的调用客户端? 在一个特定实例中,当我们的 TPS 约
我有一个 Multi-Tenancy 应用程序,其中 tenantId 将成为每个查询的一部分,因此我将其放入所有表的分区键中。 例子: CREATE TABLE users { tenantId t
根据 Datastax 文档,在 Cassandra 中先读后写是一种反模式。 每当我们在 CQLSH 中使用 UPDATE 或使用 Datastax 驱动程序来设置几列(带有 IF 和集合更新)时,
是否有命令或任何方式可以知道 Cassandra 的哪些节点上存储了哪些数据? 我对 Cassandra 很陌生,在谷歌上搜索这个问题并没有多少运气。 谢谢! 最佳答案 您可以使用 nodetool
我们有一个包含 1500 万条记录的表,而我们的表是一个 10 节点的 cassandra 集群。我们有一列有接近 20 个可重复值。是否建议在此列上建立二级索引? 最佳答案 假设在该列上完全均匀分布
Cassandra 发布了它的 technical limitations但没有提到允许的最大列数。是否有最大列数?我需要存储 400 多个字段。这在 Cassandra 中可能吗? 最佳答案 每行的
我想知道当表中有多个非 PK 列时会发生什么。我读过这个例子: http://johnsanda.blogspot.co.uk/2012/10/why-i-am-ready-to-move-to-cq
我有两个关于 Cassandra 查询结果的问题。 当我在 Cassandra 中对表进行“完全”选择(即 select * from table )时,是否保证结果将按分区标记的递增顺序返回? 例如
我无法为 Cassandra 设置 Hector。我已经浏览了 documentation和 Cassandra wiki .这些文档的问题在于,那里的很多信息都已经过时或过时(或者我缺乏知识)。无论
我正在使用 DataStax Enterprise 中 cassandra 中提供的压力测试。如果有人知道的话,我也想要一些关于它和 cassandra 的信息。 - 首先,压力测试使用哪些节点?我的
当我在 CQL 中创建表时,列的顺序是否必须精确 不是 在主键和 中不是 聚类列: CREATE TABLE user ( a ascii, b ascii, c ascii,
我有一张如下表: CREATE TABLE tab( categoryid text, id text, name text, author text, des
我正在尝试学习 Cassandra,但对术语感到困惑。 很多情况下它表示该行存储键/值对。 但是,当我定义一个表时,它更像是声明一个 SQL 表,即;您创建一个表并指定列名和数据类型。 谁能澄清一下?
如何对 cassandra 数据实现审计? 我正在寻找一个开源选项。 cassandra 是否有任何有助于审计的功能? 我可以使用触发器将记录记录到表中吗?我关注了 Triggers示例并且能够将记录
我遇到了一个问题“me.prettyprint.hector.api.exceptions.HUnavailableException:: 可能没有足够的副本来处理一致性级别。”当我有 RF=1 时,
我是一名优秀的程序员,十分优秀!