- 最新动态
- 功能总览
- 服务公告
- 产品介绍
-
GeminiDB Redis接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Redis实例
- 实例连接及管理
-
数据迁移
- Redis数据迁移方案概览
- 使用DRS服务将GeminiDB Redis迁移到Redis(推荐)
- 阿里云数据库Redis/Tair到GeminiDB Redis的迁移
- 腾讯云Redis到GeminiDB Redis的迁移
- 使用DRS服务将自建Redis或者Redis集群迁移到GeminiDB Redis(推荐)
- 通过Redis-Shake迁移工具将自建Redis迁移到GeminiDB Redis
- 使用Redis-Shake工具将RDB文件/AOF文件 导入到GeminiDB Redis
- 使用数据导入功能将RDB文件恢复到GeminiDB Redis(推荐)
- Kvrocks到GeminiDB Redis的迁移
- Pika到GeminiDB Redis的迁移
- SSDB到GeminiDB Redis的迁移
- LevelDB到GeminiDB Redis的迁移
- RocksDB到GeminiDB Redis的迁移
- AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移
- 迁移后Redis数据一致性校验
- 实例管理
- 变更实例
- 数据备份
- 数据恢复
- 诊断分析
- 账号与安全
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- GeminiDB Redis标签管理
- GeminiDB Redis用户资源配额
- 通过GeminiDB Redis实现MySQL内存加速
- 开发参考
- 最佳实践
- 性能白皮书
-
常见问题
- 高频常见问题
-
产品咨询
- GeminiDB Redis和开源Redis、其他开源Redis云服务有什么区别?
- 和开源Redis相比,GeminiDB Redis性能如何?
- GeminiDB Redis兼容Redis哪些版本,兼容哪些命令,客户端连接是否需要修改
- 自建Redis是否可以搬迁至GeminiDB Redis,需要注意什么
- 什么是GeminiDB Redis实例可用性
- GeminiDB Redis实例总容量是总内存吗,内存和容量之间是什么联系
- 购买GeminiDB Redis实例时,如何选择合适的节点规格和节点数量?
- 购买x GB的GeminiDB Redis的实例,优选主备还是集群?
- GeminiDB Redis持久化机制是怎样的,会丢数据吗
- GeminiDB Redis的内存淘汰策略是什么
- GeminiDB Redis是否支持布隆过滤器等modules
- 计费相关
-
数据库使用
- scan指定match参数,数据中确实存在匹配的key,为什么返回的是空
- 业务侧原本做了数据分片,切换到GeminiDB Redis后如何处理这部分逻辑
- GeminiDB Redis接口是否支持keys命令的模糊查询
- GeminiDB Redis是否支持多DB
- 对于scan类的操作,GeminiDB Redis接口与开源Redis 5.0的返回值顺序为什么有差异
- 针对某些不合法命令,GeminiDB Redis接口与开源Redis 5.0的报错信息为什么有差异
- 如何处理报错:CROSSSLOT Keys in request don't hash to the same slot
- GeminiDB Redis单次事务推荐包含的命令条数
- GeminiDB Redis集群版实例中,哪些命令需要使用hashtag
- 如何处理报错“ERR unknown command sentinel"
- 对于阻塞命令,GeminiDB Redis接口(主备实例)与开源Redis的返回值为什么可能有差异
- GeminiDB Redis存储扩容需要多久,对业务有影响吗?
- GeminiDB Redis多个节点同时扩容需要多长时间,对业务影响如何?
- GeminiDB Redis规格变更包含的在线变更和离线变更有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis版本补丁升级包含的在线升级和离线升级有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis备份文件是否可以下载到本地,是否支持线下恢复数据
- GeminiDB Redis数据备份工作机制是怎样的,对业务有哪些影响?
- 购买GeminiDB Redis 1U*2节点特惠型实例后,业务访问量比较少,但CPU占用率比较高,是什么原因?
- GeminiDB Redis监控面板上key数量下降又恢复至正常数量是什么原因?
- GeminiDB Redis节点CPU偶发冲高,可能是哪些原因
- GeminiDB Redis如何从5.0版本升级到6.2版本
- GeminiDB Redis什么时候进入只读
-
数据库连接
- 如何接入GeminiDB Redis
- 如何使用GeminiDB Redis提供的多个节点IP地址
- GeminiDB Redis提供的ELB的实现方式是怎样的
- 如何创建和连接弹性云服务器
- GeminiDB Redis实例购买成功后是否支持更换VPC
- 绑定了弹性公网IP但是连接不上数据库
- 内网如何访问GeminiDB Redis
- GeminiDB Redis自带的负载均衡地址是否能绑定公网IP?如何通过公网连接GeminiDB Redis实例?
- 设置了安全组,还需要设置负载均衡内网访问控制吗?
- 如何处理客户端连接池报错“Could not get a resource from the pool”
- 常见客户端报错及解决方法
- 备份与恢复
- 区域和可用区
-
数据迁移
- DRS上找不到GeminiDB Redis链路
- 报错ERR the worker queue is full, and the request cannot be excecuted
- 报错ERR the request queue of io thread is full, and the request cannot be excecuted
- 报错 read error, please check source redis log or network
- 报错 slaveping_thread.cc-ThreadMain-90: error: Ping master error
- 同步状态正向迁移速度太慢
- 同步状态正向迁移速度太快,报错:ERR server reply timeout, some responses may lose, but requests have been executed
- 4.0、5.0以及6.2版本的自建Redis能迁移至GeminiDB Redis吗?
- 自建Redis主备、集群实例如何迁移到GeminiDB Redis?
- 为什么阿里云Redis、腾讯云Redis等云服务不能使用DRS进行数据迁移?
- 自建主备Redis,迁移到GeminiDB Redis集群,需要考虑哪些因素?
- 迁移完成后数据量变少了,100GB的数据迁移到GeminiDB Redis只有20-30GB,数据是不是没迁移完?
- 内存加速
- 资源冻结/释放/删除/退订
- GeminiDB Influx接口
-
GeminiDB Cassandra接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Cassandra实例
- 实例连接及管理
- 数据迁移
- 实例生命周期管理
- 变更实例
- 同城容灾
- 异地双活
- 数据备份
- 数据恢复
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- 企业项目
- GeminiDB Cassandra标签管理
- GeminiDB Cassandra用户资源配额
- 最佳实践
- 性能白皮书
- 常见问题
- GeminiDB (兼容DynamoDB API)实例
- HBase协议兼容版实例
- GeminiDB Mongo接口
- 技术白皮书
-
API参考
- 使用前必读
- API概览
- 如何调用API
- 快速入门
-
API v3(推荐)
- 查询API版本
- 接口版本和规格
-
实例管理
- 创建实例
- 删除实例
- 查询实例列表和详情
- 扩容实例存储容量
- 扩容实例的节点数量
- 缩容实例的节点数量
- 获取节点会话列表
- 查询实例节点会话统计信息
- 关闭实例节点会话
- 查询实例可变更规格
- 变更实例规格
- 修改实例的管理员密码
- 修改实例名称
- 变更实例安全组
- 数据库补丁升级
- 批量数据库补丁升级
- 创建冷数据存储
- 扩容冷数据存储
- 绑定/解绑弹性公网IP
- 切换实例SSL开关
- 重启实例
- 设置磁盘自动扩容策略
- 修改数据库端口
- 判断弱密码
- 修改副本集跨网段访问配置
- 删除扩容失败的节点
- 查询创建实例或扩容节点时需要的IP数量
- 查询磁盘自动扩容策略
- 变更实例存储容量
- 查询高危命令
- 修改高危命令
- 查询Redis实例的热key
- 设置Redis禁用命令
- 查询Redis禁用命令
- 删除Redis禁用命令
- 设置实例可维护时间段
- Redis主备切换
- 支持节点的开关机
- 查询GeminiDB Redis实例的大key
- 获取GeminiDB Redis的免密配置
- 支持修改GeminiDB Redis的免密配置
- 查询内存加速映射列表和详情
- 创建内存加速规则
- 解除内存加速映射
- 创建内存加速映射
- 修改内存加速规则
- 查询内存加速规则列表和详情
- 删除内存加速规则
- 开启/关闭实例数据导出
- 开启/关闭秒级监控
- 查询秒级监控配置
- 连接管理
- 备份与恢复
- 参数模板管理
- 管理数据库和账号
- 标签管理
- 日志管理
- 配额管理
- 容灾管理
- 任务管理
- 企业项目管理
- 实例负载均衡管理
- API v3(即将下线)
- 权限策略和授权项
- 附录
- SDK参考
- 场景代码示例
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
如何使用Lucene搜索索引
GeminiDB Cassandra支持Lucene搜索索引已实现多维查询、文本检索、统计分析等能力,在使用体验上和原生二级索引相似,但同时拥有了更为丰富的语法支持。
当前Cassandra二级索引的痛点
原生Cassandra中二级索引的实现其实是创建了一张隐式的表,该表的Primary Key是创建索引的列,值为对应的Primary Key,实现相对简单,因此不可避免地带来了一些约束条件:
- 第一主键只能用“=”查询。
- 第二主键可以使用“=、>、<、>=、<=”。
- 索引列只支持“=”查询。
- 删除、更新太过频繁的列不适合建立索引。
- High-cardinality列不适合做索引。
基于以上约束,Cassandra二级索引能提供的查询功能较为局限。
Lucene搜索索引架构
关键技术点:
内嵌Lucene搜索引擎,与存储引擎搭配,实现宽表存储引擎与搜索引擎的深度融合;
SQL层统一融合,在兼容原生Cassandra语法基础上,提供多维查询、文本检索、模糊查询、统计分析等能力,全面提升用户在海量数据场景下的查询体验。

Lucene搜索索引使用方式举例

表结构示例:
CREATE TABLE example (pk1 text, pk2 bigint, ck1 int,ck2 text,col1 int, col2 int, col3 text, col4 text, PRIMARY KEY ((pk1,pk2),ck1, ck2));
四个属性列创建Lucene搜索索引:
CREATE CUSTOM INDEX index_lucene ON test.example(col1,col2,col3,col4) USING 'LuceneGlobalIndex' WITH OPTIONS = { 'table_tokens': '3', 'analyzed_columns': 'col4', 'disable_doc_value': 'col4', 'ordered_columns': 'col3,col4', 'ordered_sequences': 'desc,asc', 'analyzer_class': 'StandardAnalyzer' };
参数名 |
作用 |
---|---|
table_tokens |
指定初始化Lucene搜索索引分片数,不指定默认为3,分片会占用一定的cpu和内存资源,并随数据量增长而增加。 |
analyzed_columns |
指定用于全文搜索的列。 |
analyzer_class |
指定全文搜索使用的分词器。 中文解析器: 'analyzer_class': 'SmartChineseAnalyzer' 标准解析器: 'analyzer_class': 'StandardAnalyzer' IK解析器: 'analyzer_class': 'IKAnalyzer' |
ordered_columns |
指定Lucene搜索索引默认排序,不指定时默认与cassandra排序保持一致,多个索引列通过逗号隔开,需要注意:只有查询时排序方式与默认排序一致时,查询效率最高。 |
ordered_sequences |
指定排序索引列升降序,asc代表升序,desc代表降序,需要与ordered_columns一一对应。 |
disable_doc_value |
指定索引列不进行DocValues存储,对于不需要进行排序、聚合等操作的索引列可以禁用DocValues存储。 |
多维查询:任意索引列组合的嵌套查询,支持精确查询和范围查询。
SELECT * from example WHERE pk1>='a' and pk2>=1000 and ck2 in ('a','b','c') and col1 <= 4 and col2 >= 2;
count计数:获取数据表的总行数,或根据索引列具体查询条件返回命中的数据行数。
SELECT count(*) FROM example WHERE col1 > 3 AND EXPR(index_lucene, 'count');
索引列排序:支持指定多个索引列排序规则,结合多维查询,返回指定排序的结果集。(通过JSON扩展语义支持,见下一节扩展JSON语义)
模糊查询:支持前缀查询和通配符查询。
SELECT * FROM example WHERE col3 LIKE 'test%'; SELECT * FROM example WHERE col3 LIKE 'start*end';
聚合分析:按照索引列组合条件进行简单的聚合分析(sum/max/min/avg)
SELECT sum(col1) from example WHERE pk1>='a' and pk2>=1000 and col1 <= 4 and col2 >= 2;
全文检索:支持指定中/英文分词器,进行分词检索,返回相关性高的结果。
SELECT * FROM example WHERE col4 LIKE '%+test -index%';
扩展JSON语义:
关键字 |
作用 |
---|---|
filter |
在查询语句中json查询的关键字。 |
term |
查询时判断某个document是否包含某个具体的值。 |
match |
将被询值进行分词,进行全文检索。 |
range |
查询指定某个字段在某个特定的范围。(范围查询子关键字:"eq"/"gte"/"gt"/"lte"/"lt") |
bool |
必须和 "must"、"should"、"must not" 一起组合出复杂的查询。 |
must |
bool类型的子查询,封装"term"、"match"、"range" 查询。 |
should |
bool类型的子查询,封装"term"、"match"、"range" 查询。 |
must not |
bool类型的子查询,封装"term"、"match"、"range" 查询。 |
sort |
支持全局索引列排序功能。 |
典型JSON查询语句示例:
{ "filter": { "bool": { "should": [ {"term": {"col1": 1, "col1": 2, "col1": 3, "col3": "testcase7"}} ], "must": [ {"range": {"col2": {"lte": 7, "gt": 0}, "ck1": {"gte": 2}}}, {"match": {"col4": "+lucene -index"}} ] } }, "sort": [{"col1":"desc"}, {"col2":"asc"}] }
完整cql如下:
SELECT * from example where expr(index_lucene, '{"filter": {"bool": {"should": [{"term": {"col1": 1, "col1": 2, "col1": 3, "col3": "testcase7"}}], "must": [{"range": {"col2": {"lte": 7, "gt": 0}, "ck1": {"gte": 2}}},{"match": {"col4": "+lucene -index"}}]}}, "sort": [{"col1":"desc"}, {"col2":"asc"}]}');
下面对典型的查询场景cql语句结合JSON一起进行对比举例:
1. 带分区键的查询(指定pk1、pk2),需要将pk1和pk2从json条件中剥离出来,否则会影响性能。
SELECT * from example where pk1=*** and pk2=*** and expr(index_lucene, 'json');
2. 查询条件: col1=1。
SELECT * from example WHERE col1=1; SELECT * from example WHERE expr(index_lucene, '{"filter": {"term": {"col1": 1}}}'); SELECT * from example WHERE expr(index_lucene, '{"filter": {"bool": {"must": [{"term": {"col1": 1}}]}}}');
上面三条语句,是等效的;类似这种情况,建议使用第一种的普通cql查询,只有当普通cql无法支持时,再使用json扩展查询;上面三个语句推荐顺序次为从上到下。
3. 查询条件:col1=1 and col2>=2。
SELECT * from example WHERE col1=1 and col2>=2; SELECT * from example WHERE expr(index_lucene, '{"filter": {"term": {"col1": 1},"range": {"col2": {"gte": 2}}}}'); SELECT * from example WHERE expr(index_lucene, '{"filter": {"bool": {"must": [{"term": {"col1": 1}}, {"range": {"col2": {"gte": 2}}}]}}}');
与第一种相同,推荐普通cql查询。
4. 查询条件:col1=1 and (col2<2 or col2>3)。
SELECT * from example WHERE expr(index_lucene, '{"filter": {"bool": {"must": [{"term": {"col1": 1}}], "should": [{"range": {"col2": {"lt": 2}, "col2": {"gt": 3}}}]}}}'); SELECT * from example WHERE expr(index_lucene, '{"filter": {"bool": {"must": [{"term": {"col1": 1}}], "must_not": [{"range": {"col2": {"gte": 2, "lte": 3}}}]}}}');
上面两种方式效果相同,但是不推荐使用"must_not",性能不如"should"。
5. 查询条件:col1 in (1,2,3,4) and (col2<2 or col2>3)。
SELECT * from example WHERE expr(index_lucene, '{"filter": {"bool": {"should": [{"term": {"col1": 1, "col1": 2, "col1": 3, "col1": 4}}], "should": [{"range": {"col2": {"lt": 2}, "col2": {"gt": 3}}}]}}}'); SELECT * from example WHERE expr(index_lucene, '{"filter": {"bool": {"should": [{"term": {"col1": 1, "col1": 2, "col1": 3, "col1": 4}}], "must_not": [{"range": {"col2": {"gte": 2, "lte": 3}}}]}}}');
与4一样,上面两种方式效果相同,但是不推荐使用"must_not",性能不如"should"。
6. 带分区键single查询:pk1='a' and pk2=1000 and col1 in (1,2,3,4) and (col2<2 or col2>3)。
SELECT * from example WHERE pk1='a' and pk2=1000 and expr(index_lucene, '{"filter": {"bool": {"should": [{"term": {"col1": 1, "col1": 2, "col1": 3, "col1": 4}}], "should": [{"range": {"col2": {"lt": 2}, "col2": {"gt": 3}}}]}}}');
7. 查询条件:(((ck1<2 or ck1>=4) and (col1<2 or col1 >3)) or (pk1 in ('a', 'b', 'c'))) or (5<=col2<15 and pk2 > 2000)。
SELECT * from example WHERE expr(index_lucene, '{"filter": {"bool": {"should": [{"bool": {"should": [{"bool": {"must": [{"bool": {"should": [{"range": {"ck1": {"lt": 2}, "ck1": {"gte": 4}}}]}}, {"bool": {"should": [{"range": {"col1": {"lt": 2}, "col1": {"gt": 3}}}]}}]}}, {"bool": {"should": [{"term": {"pk1": "a", "pk1": "b", "pk1": "c"}}]}}]}}, {"bool": {"must": [{"range": {"col2": {"gte":5, "lte": 15}, "pk2": {"gt": 2000}}}]}}]}}}');
8. count 查询,也可使用json构造查询条件,上面的查询条件,进行count查询,语句如下
SELECT count(*) from example WHERE expr(index_lucene, '{"filter": {"bool": {"should": [{"bool": {"should": [{"bool": {"must": [{"bool": {"should": [{"range": {"ck1": {"lt": 2}, "ck1": {"gte": 4}}}]}}, {"bool": {"should": [{"range": {"col1": {"lt": 2}, "col1": {"gt": 3}}}]}}]}}, {"bool": {"should": [{"term": {"pk1": "a", "pk1": "b", "pk1": "c"}}]}}]}}, {"bool": {"must": [{"range": {"col2": {"gte":5, "lte": 15}, "pk2": {"gt": 2000}}}]}}]}}}');
注意事项:
- 普通cql可以满足的查询条件,尽量避免依赖json查询。
- 单分区查询,要将分区键条件单独作为查询条件,不要放入json中,否则会影响single查询的性能。
- 尽量避免使用"must_not"。
- 如果查询总是需要按照某些索引列排序输出,可以考虑在创建索引时指定该排序方式为默认排序以提升性能。