[Preview] 全文倒排索引
自 3.3.0 起,StarRocks 支持全文倒排索引,将文本中的每个单词进行分词处理,并为每个词建立一 个索引项,记录该单词与其所在数据文件行号的映射关系。进行全文检索时,StarRocks 会根据查询的关键词对倒排索引进行查询,快速定位到与关键词匹配的数据行。
StarRocks 存算分离集群暂时不支持全文倒排索引。
功能简介
StarRocks 底层数据是按列存储在数据文件。每个数据文件会包含基于索引列的全文倒排索引。索引列的值会被分割为一个一个词,然后每个分词后的词语都会被视为一个索引项,与包含该词语的数据文件行号构成映射关系。目前支持的分词方式有英文分词、中文分词、多语言分词、不分词。
比如有一行数据 hello world
在数据文件的行号是 123,分词成 hello
和 world
两个词。全文倒排索引就会根据这个分词结果和行号构建索引项:hello->123, world->123。
进行全文检索时,借助全文倒排索引,StarRocks 可以根据查询条件中的关键词,找到包含关键词的索引项,然后快速找到关键词所在数据文件行号,大幅减少需要扫描的数据行数。
基本操作
创建全文倒排索引
创建全文倒排索引前,需要开启 FE 配置项 enable_experimental_gin
。
ADMIN SET FRONTEND CONFIG ("enable_experimental_gin" = "true");
并且创建时,仅支持表的类型为明细表并且必须设置表属性 replicated_storage
为 false
。
建表时创建全文倒排索引
基于列 v
构建全文倒排索引并且使用英文分词。
CREATE TABLE `t` (
`k` BIGINT NOT NULL COMMENT "",
`v` STRING COMMENT "",
INDEX idx (v) USING GIN("parser" = "english")
) ENGINE=OLAP
DUPLICATE KEY(`k`)
DISTRIBUTED BY HASH(`k`) BUCKETS 1
PROPERTIES (
"replicated_storage" = "false"
);
parser
表示分词方式,支持的取值和描述如下:none
(默认):不分词,索引列的整行数据作为一个索引项构建全文倒排索引。english
:英文分词,通常在任何非字母的字符分词。并且英文进行分词处理后,大写英文会转换为小写英文。因此查询时条件中关键词需要为小写英文而不是大写英文,才能借助全文倒排索引定位到数据行。chinese
:中文分词,使用 CJK Analyzer 进行分词处理。standard
:多语言分词。基于语法进行分词(基于 Unicode 文本分割算法,如 Unicode 标准附录 #29 中所指定的),适用于大多数语言,以及多语言混合的情况,比如中英文混合。例如中英文同时存在时,支持区分中英文,英文进行分词处理后,同时大写英文转小写,因此查询时条件中关键词需要为小写英文而不是大写英文,才能借助全文倒排索引定位到数据行。
- 索引列的数据类型必须是 CHAR、VARCHAR、STRING。