StarRocks全文倒排索引技术解析
全文倒排索引概述
全文倒排索引是StarRocks 3.3.0版本引入的一项重要功能,它通过将文本内容分解为更小的词项(token),并为每个词项建立索引项,记录词项与数据文件中行号的映射关系。这种索引结构特别适合处理全文搜索场景,能够显著提升文本检索效率。
核心原理
StarRocks底层数据按列存储在数据文件中。当为某列创建全文倒排索引后:
- 系统会对该列的值进行分词处理(根据指定的分词器)
- 每个分词结果作为索引项,映射到包含该词项的行号
- 查询时,系统通过索引快速定位包含关键词的行号,大幅减少需要扫描的数据量
例如,某行数据包含"hello world"且行号为123,索引会建立两个条目:hello->123和world->123。
索引创建与管理
前置准备
在创建全文倒排索引前,需要:
- 启用FE配置项
enable_experimental_gin
- 确保表为Duplicate Key表且表属性
replicated_storage
设为false
创建方式
建表时创建
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"
);
表创建后添加
ALTER TABLE t ADD INDEX idx (v) USING GIN('parser' = 'english');
-- 或
CREATE INDEX idx ON t (v) USING GIN('parser' = 'english');
分词器选择
StarRocks支持多种分词方式:
- english:英文分词
- 按非字母字符切分
- 自动转为小写
- chinese:中文分词
- 基于CJK Analyzer实现
- standard:多语言分词
- 支持混合语言场景(如中英文混合)
- 同样会将英文转为小写
- none:不分词
- 整行数据作为一个索引项
查询加速实践
启用索引加速
确保系统变量enable_gin_filter
已开启,索引才能生效。
分词场景查询
当索引列配置了分词器时,仅支持MATCH
谓词:
-- 查询包含"starrocks"的行
SELECT * FROM t WHERE t.value MATCH "starrocks";
-- 查询以"data"开头的行
SELECT * FROM t WHERE t.value MATCH "data%";
注意事项
- 模糊匹配需使用
%
,但关键词必须包含词的一部分 - 英文分词会将大写转为小写存储,查询时需用小写
MATCH
必须作为下推谓词出现在WHERE子句中
非分词场景查询
当索引列未配置分词器时,支持更多谓词:
- 表达式谓词:(NOT) LIKE, (NOT) MATCH
- 常规谓词:=, !=, <=, >=, IN, NOT IN, IS NULL, IS NOT NULL
性能验证
通过Query Profile中的GinFilterRows
和GinFilter
指标可验证索引效果:
GinFilterRows
:通过索引过滤的行数GinFilter
:索引过滤耗时
最佳实践建议
- 英文内容推荐使用
english
分词器 - 中文内容推荐使用
chinese
分词器 - 混合语言场景使用
standard
分词器 - 精确匹配场景可考虑使用
none
不分词模式 - 查询时注意关键词大小写问题(英文分词场景)
全文倒排索引是StarRocks在文本检索领域的重要增强,合理使用可大幅提升相关查询性能。开发者应根据实际数据特点和查询模式选择合适的分词器,并遵循推荐的查询语法以获得最佳效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考