Cassandra中的SASI索引及其与正常索引的不同之处

时间:2018-02-11 18:03:01

标签: apache cassandra cassandra-3.0

我开始使用 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)什么是最好的配置,如mode,analyzer_class和case_sensitive - 有关此的任何推荐文档吗?

谢谢,
哈利

2 个答案:

答案 0 :(得分:6)

1)有人可以解释它与Cassandra中的正常二级索引的区别吗?

普通二级索引本质上是另一个查找表,包括二级索引列&首要的关键。因此它有自己的一组sstable文件(磁盘),memtable(内存)和写入开销(cpu)。

SASI是Cassandra社区的开源改进(由Apple提供)。为每个刷新到磁盘的SSTable创建此索引,并且不会维护单独的表。因此磁盘使用量减少,没有单独的memtable / bloom过滤器/分区索引(更少的内存)和最小的开销。

2)什么是最好的配置,如mode,analyzer_class和case_sensitive - 有关此的任何推荐文档吗?

配置取决于您的使用案例: -

基本上有三种模式

  1. PREFIX - 用于根据索引列的前缀
  2. 提供LIKE查询
  3. CONTAINS - 用于根据索引列中是否存在搜索词来提供LIKE查询
  4. SPARSE - 用于索引稀疏数据(每个术语/列值少于5个匹配键)。例如,跨越大时间戳的范围查询。
  5. Analyzer_class:可以指定分析器来分析指定列中的文本。

    1. NonTokenizingAnalyzer 用于未分析文本但需要大小写规范化或敏感度的情况。
    2. StandardAnalyzer 用于分析,包括词干分析,大小写归一化,区分大小写,跳过常见词,如"和"和""以及用于完成分析的语言的本地化
    3. case_sensitive:顾名思义,索引列是否应该搜索不区分大小写。适用的值是

      1. 详细文档参考here以及performance上的详细博文。

答案 1 :(得分:1)

以下是https://github.com/scylladb/scylla/wiki/Indexing-in-Cassandra-3中SASI的简短摘要:

SASI(“ SStable附加二级索引”的缩写)是对经典Cassandra二级索引的重新实现,其主要目标是-有效地支持更复杂的搜索查询,例如:

  • AND或OR组合查询。
  • 通配符搜索字符串值。
  • 范围查询。
  • 受Lucene启发的单词搜索字符串值(包括分词,大写归一化,词干等,由用户提供的“分析器”确定)。

其中一些事情已经可以通过二级索引实现,但是效率很低,因为需要获取一长串分区,读取分区(要求对每个分区进行低效率的搜索)并对其进行过滤。 SASI使用基于B +树的新磁盘格式来实现它们,并且不会像常规的次要索引方法那样重复使用常规的Cassandra列族或sstables。

SASI在每个sstable上附加其自己的不可变索引文件(并由此方法的名称),并在每个memtable上附加一个索引。在压缩过程中,还将压缩在一起的文件索引以创建一个新索引。