创建倒排索引
具体介绍参考倒排索引介绍
语法
CREATE TABLE table_name(
columns_difinition,
INDEX index_name (column_name) INVERTED [COMMENT ''] PROPERTIES('analyzer'='english|chinese|keyword|unicode'),
INDEX index_name (column_name) INVERTED [COMMENT ''] PROPERTIES('analyzer'='english|chinese|keyword|unicode'),
....
INDEX index_name (column_name) INVERTED [COMMENT ''] PROPERTIES('analyzer'='english|chinese|keyword|unicode')
);
columns_difinition:定义表的字段信息,最后一个字段必须使用逗号隔开
INDEX:关键字
index_name:自定义index的名称
column_name:需要添加索引的字段名称
INVERTED:关键字,表示倒排索引
COMMENT:指定index的说明信息
PROPERTIES:指定INDEX的参数,支持的属性目前支持指定分词。数值和日期类型则不需要指定properties,如果是字符串类型要求必须指定分词
- 分词参数:'analyzer'='english|chinese | keyword|unicode',用于指定文本分词的策略,适用于不同的语言和需求。
- keyword: 此类型的字段不会进行分词。整个字符串被视为单一的词根,并存储在倒排索引中。搜索时,需要提供完整的字段值以实现精确匹配。
- english: 专为英文设计的分词器,仅识别连续的ASCII字母和数字,并将文本统一转换为小写。适合处理英文内容,忽略非字母数字字符。
- chinese: 中文文本分词插件,识别中文和英文字符,同时过滤掉标点符号,并将英文字母转换为小写。适用于中英文混合文本的处理。
- unicode: 基于Unicode文本分割算法的分词器,能够识别多种语言的文本边界,有效将文本分割成单词,并将字母转换为小写。适合多语言环境下的文本处理。
参考文档
案例
CREATE TABLE inverted_index_test(
id int,
name string,
INDEX id_index (id) INVERTED ,
INDEX name_index (name) INVERTED PROPERTIES('analyzer'='keyword')
);
已有的表增加倒排索引
语法
CREATE INVERTED INDEX [IF NOT EXISTS] index_name ON TABLE
[schema].table_name(col_name)
[COMMENT 'comment']
PROPERTIES('analyzer'='english|chinese|keyword|unicode')
INVERTED: 索引类型,倒排索引
index_name: 表名字,位于schema下,schema下索引名称不能重复
col_name:列名只支持单列
PROPERTIES:指定INDEX的参数,支持的属性目前支持指定分词。数值和日期类型则不需要指定properties,如果是字符串类型要求必须指定分词
说明
执行CREATE INDEX仅对新增数据有效,对已有数据进行索引请使用BUILD INDEX命令。
案例
- 建表时指定倒排索引
DROP TABLE IF EXISTS t;
CREATE TABLE t (
order_id INT,
customer_id INT,
amount DOUBLE,
order_year string,
order_month string,
INDEX order_id_index (order_id) INVERTED COMMENT 'INVERTED'
);
INSERT INTO t
VALUES (1, 101, 100.0, '2023','01'),
(2, 102, 200.0, '2023','02'),
(3, 103, 300.0, '2023','03'),
(4, 104, 400.0, '2023','04'),
(5, 105, 500.0, '2023','04');
DESC INDEX order_id_index;
+--------------------+-------------------------+
| info_name | info_value |
+--------------------+-------------------------+
| name | order_id_index |
| creator | UAT_TEST |
| created_time | 2024-12-27 10:39:44.778 |
| last_modified_time | 2024-12-27 10:39:44.778 |
| comment | INVERTED |
| index_type | inverted |
| table_name | t |
| table_column | order_id |
+--------------------+-------------------------+
--使用倒排索引查询
SELECT *
FROM t
WHERE match_any (order_id, 3);
+----------+-------------+--------+------------+-------------+
| order_id | customer_id | amount | order_year | order_month |
+----------+-------------+--------+------------+-------------+
| 3 | 103 | 300.0 | 2023 | 03 |
+----------+-------------+--------+------------+-------------+
2.给已有的列添加BLOOMFILTER索引
CREATE INVERTED INDEX order_year_index
ON TABLE public.t (order_year)
PROPERTIES('analyzer'='chinese');
--倒排索引添加完成后只有新写入的数据才会生效。老数据不会生效。如果老数据需要可以使用BUILD INDEX命令
BUILD INDEX order_year_index ON public.t;
DESC INDEX EXTENDED order_year_index;
+--------------------------+--------------------------+
| info_name | info_value |
+--------------------------+--------------------------+
| name | order_year_index |
| creator | UAT_TEST |
| created_time | 2024-12-27 10:51:58.977 |
| last_modified_time | 2024-12-27 10:51:58.977 |
| comment | |
| properties | (("analyzer","chinese")) |
| index_type | inverted |
| table_name | t |
| table_column | order_year |
| index_size_in_data_file | 0 |
| index_size_in_index_file | 296 |
| total_index_size | 296 |
+--------------------------+--------------------------+
SELECT *
FROM t
WHERE match_all (order_year, '2023');
+----------+-------------+--------+------------+-------------+
| order_id | customer_id | amount | order_year | order_month |
+----------+-------------+--------+------------+-------------+
| 1 | 101 | 100.0 | 2023 | 01 |
| 2 | 102 | 200.0 | 2023 | 02 |
| 3 | 103 | 300.0 | 2023 | 03 |
| 4 | 104 | 400.0 | 2023 | 04 |
| 5 | 105 | 500.0 | 2023 | 04 |
+----------+-------------+--------+------------+-------------+