Cassandra 中的 SASI 索引及其与普通索引的区别
SASI index in Cassandra and How it differs from normal indexing
我开始使用 SASI 索引 并使用了以下设置,
CREATE TABLE employee (
id int,
lastname text,
firstname text,
dateofbirth date,
PRIMARY KEY (id, lastname, firstname)
) WITH CLUSTERING ORDER BY (lastname ASC, firstname ASC));
CREATE CUSTOM INDEX employee_firstname_idx ON employee (firstname) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};
我执行以下查询,
SELECT * FROM employee WHERE firstname like '%s';
根据我的研究,它似乎与 Cassandra 中的普通二级索引相同,除了提供 LIKE 搜索,
1) 有人可以解释一下它与 Cassandra 中的普通二级索引有何不同吗?
2) 模式、analyzer_class 和 case_sensitive 等最佳配置是什么 - 是否有推荐的文档?
1) 有人可以解释一下它与 Cassandra 中的普通二级索引有何不同吗?
普通二级索引本质上是另一个查找 table,包含二级索引列和主键。因此它有自己的一组 sstable 文件(磁盘)、memtable(内存)和写入开销(cpu)。
SASI 是对 Cassandra 社区的开源改进(由 Apple 贡献)。该索引是为每个刷新到磁盘的 SSTable 而创建的,并且不维护单独的 table。因此更少的磁盘使用,没有单独的 memtable/bloom filter/partition 索引(更少的内存)和最小的开销。
2) 模式、analyzer_class 和 case_sensitive 等最佳配置是什么 - 是否有任何推荐的文档?
配置取决于您的用例:-
本质上就是三种模式
- PREFIX - 用于根据索引列的前缀提供 LIKE 查询
- CONTAINS - 用于根据搜索词是否存在于索引列中来提供 LIKE 查询
- SPARSE - 用于索引稀疏数据(每个 term/column 值的匹配键少于 5 个)。例如跨越大时间戳的范围查询。
Analyzer_class : 可以指定分析器来分析指定列中的文本。
- NonTokenizingAnalyzer用于不分析文本但需要大小写规范化或敏感性的情况。
- StandardAnalyzer 用于涉及词干提取、大小写归一化、区分大小写、跳过 "and" 和 "the" 等常用词的分析,以及本地化用于完成分析的语言
case_sensitive :顾名思义,是否应该不区分大小写地搜索索引列。适用的值为
- 正确
- 错
详细文档参考here and detailed blog post on performance.
这是来自 https://github.com/scylladb/scylla/wiki/Indexing-in-Cassandra-3 的 SASI 的简短摘要:
SASI("SStable-Attached Secondary Indexing" 的首字母缩写词)是经典 Cassandra 二级索引的重新实现,其主要目标是——高效支持更复杂的搜索查询,例如:
- 查询的 AND 或 OR 组合。
- 字符串值中的通配符搜索。
- 范围查询。
- 字符串值中受 Lucene 启发的单词搜索(包括断字、大写规范化、词干提取等,由用户给定 "Analyzer" 确定)。
其中一些事情已经可以通过二级索引实现,但效率低下,因为需要获取一长串分区、读取它们(需要对每个分区进行低效查找)并对其进行过滤。 SASI 使用基于 B+ 树的新磁盘格式实现它们,并且不像经典的二级索引方法那样重用常规 Cassandra 列族或 sstables。
SASI 将其自己的不可变索引文件(以及此方法的名称)附加到每个 sstable,并且还将索引附加到每个 memtable。 compaction时,将被compaction在一起的文件的index也一起compact,创建一个新的index。
我开始使用 SASI 索引 并使用了以下设置,
CREATE TABLE employee (
id int,
lastname text,
firstname text,
dateofbirth date,
PRIMARY KEY (id, lastname, firstname)
) WITH CLUSTERING ORDER BY (lastname ASC, firstname ASC));
CREATE CUSTOM INDEX employee_firstname_idx ON employee (firstname) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};
我执行以下查询,
SELECT * FROM employee WHERE firstname like '%s';
根据我的研究,它似乎与 Cassandra 中的普通二级索引相同,除了提供 LIKE 搜索,
1) 有人可以解释一下它与 Cassandra 中的普通二级索引有何不同吗?
2) 模式、analyzer_class 和 case_sensitive 等最佳配置是什么 - 是否有推荐的文档?
1) 有人可以解释一下它与 Cassandra 中的普通二级索引有何不同吗?
普通二级索引本质上是另一个查找 table,包含二级索引列和主键。因此它有自己的一组 sstable 文件(磁盘)、memtable(内存)和写入开销(cpu)。
SASI 是对 Cassandra 社区的开源改进(由 Apple 贡献)。该索引是为每个刷新到磁盘的 SSTable 而创建的,并且不维护单独的 table。因此更少的磁盘使用,没有单独的 memtable/bloom filter/partition 索引(更少的内存)和最小的开销。
2) 模式、analyzer_class 和 case_sensitive 等最佳配置是什么 - 是否有任何推荐的文档?
配置取决于您的用例:-
本质上就是三种模式
- PREFIX - 用于根据索引列的前缀提供 LIKE 查询
- CONTAINS - 用于根据搜索词是否存在于索引列中来提供 LIKE 查询
- SPARSE - 用于索引稀疏数据(每个 term/column 值的匹配键少于 5 个)。例如跨越大时间戳的范围查询。
Analyzer_class : 可以指定分析器来分析指定列中的文本。
- NonTokenizingAnalyzer用于不分析文本但需要大小写规范化或敏感性的情况。
- StandardAnalyzer 用于涉及词干提取、大小写归一化、区分大小写、跳过 "and" 和 "the" 等常用词的分析,以及本地化用于完成分析的语言
case_sensitive :顾名思义,是否应该不区分大小写地搜索索引列。适用的值为
- 正确
- 错
详细文档参考here and detailed blog post on performance.
这是来自 https://github.com/scylladb/scylla/wiki/Indexing-in-Cassandra-3 的 SASI 的简短摘要:
SASI("SStable-Attached Secondary Indexing" 的首字母缩写词)是经典 Cassandra 二级索引的重新实现,其主要目标是——高效支持更复杂的搜索查询,例如:
- 查询的 AND 或 OR 组合。
- 字符串值中的通配符搜索。
- 范围查询。
- 字符串值中受 Lucene 启发的单词搜索(包括断字、大写规范化、词干提取等,由用户给定 "Analyzer" 确定)。
其中一些事情已经可以通过二级索引实现,但效率低下,因为需要获取一长串分区、读取它们(需要对每个分区进行低效查找)并对其进行过滤。 SASI 使用基于 B+ 树的新磁盘格式实现它们,并且不像经典的二级索引方法那样重用常规 Cassandra 列族或 sstables。
SASI 将其自己的不可变索引文件(以及此方法的名称)附加到每个 sstable,并且还将索引附加到每个 memtable。 compaction时,将被compaction在一起的文件的index也一起compact,创建一个新的index。