Cassandra中的SASI索引及其与普通索引的区别

10
我开始使用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)最佳配置选项如模式、分析器类和区分大小写等,是否有任何推荐的文档可供参考?

2
无关的评论 - 对于查询,最好使用预准备的查询而不是为每个参数构建查询。 - Alex Ott
2个回答

14

1) 有人能解释一下它与Cassandra中的普通二级索引有何不同吗?

普通二级索引本质上是另一个查找表,包括二级索引列和主键。因此它有自己的SSTable文件(磁盘),内存表(内存)和写入开销(CPU)。

SASI是对Cassandra社区做出的改进,由Apple进行开源贡献。该索引为每个刷新到磁盘的SSTable创建一个索引,不维护单独的表。因此,磁盘使用率更低,没有单独的内存表/布隆过滤器/分区索引(内存使用率更低),开销最小。

2) 最佳配置项如mode、analyzer_class和case_sensitive - 是否有任何推荐的文档?

配置取决于你的用例:

基本上有三种模式:

  1. PREFIX - 用于基于索引列的前缀服务LIKE查询
  2. CONTAINS - 用于基于索引列中是否存在搜索词服务LIKE查询
  3. SPARSE - 用于索引稀疏数据(每个术语/列值具有少于5个匹配键)。例如跨大时间戳范围的范围查询。

analyzer_class:可以指定要分析指定列中的文本的分析器。

  1. NonTokenizingAnalyzer用于文本未经分析但需要进行大小写规范化或大小写敏感性的情况。
  2. StandardAnalyzer用于涉及词干提取、大小写规范化、大小写敏感性、跳过常见单词(如“and”和“the”)以及语言本地化等分析的情况。

case_sensitive:顾名思义,该索引列是否应该大小写不敏感地搜索。适用值为:

  1. True
  2. False

详细的文档可以在这里查看,有关性能的详细博客文章。


1
强烈推荐阅读此博客文章http://www.doanduyhai.com/blog/?p=2058#sasi_perf_benchmarks - dilsingi
1
在SASI的情况下,这些值形成一个Btree索引。因此,该值直接指向sstable中的数据,跳过布隆过滤器和分区索引。 - dilsingi
如果我有一个值,比如“澳大利亚”,并且我对这个国家列进行索引,那么它会形成像A、AU、AUS、AUST等所有组合的搜索字符串,并映射到SSTable吗? - Harry
如果我指定分区键,使用SASI作为本地二级索引是否有优势? - Harry
1
@Harry 我相信我已经为你的原始问题提供了解决方案。请记得接受/点赞答案。 - dilsingi
显示剩余3条评论

5
以下是关于 SASI 的简要概述,来源于https://github.com/scylladb/scylla/wiki/Indexing-in-Cassandra-3
SASI(即“SStable-Attached Secondary Indexing”)重新实现了经典的 Cassandra 二级索引,并具有一个主要目标 - 支持更复杂的搜索查询,例如:
- 查询的 AND 或 OR 组合。 - 字符串值中的通配符搜索。 - 范围查询。 - 受 Lucene 启发的字符串值的单词搜索(包括词断、大写规范化、词干提取等,由用户给定的“分析器”确定)。
其中一些在二级索引中已经可以实现,但效率较低,因为需要获取长列表的分区,对它们进行读取(需要对每个分区进行低效的寻址)并对它们进行过滤。 SASI 使用基于 B+ 树的新磁盘格式实现它们,并且不像经典二级索引方法那样重用常规的 Cassandra 列族或 sstable。
SASI 将其自己的不可变索引文件附加到每个 sstable 上(因此称之为这种方法的名称),并且还将索引附加到每个 memtable 上。在压缩期间,压缩在一起的文件的索引也会被压缩以创建一个新的索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接