全文检索(或仅文本搜索)提供了识别满足查询的自然语言文档的功能。最常见的搜索类型是查找包含给定查询词的所有文档。全文索引允许对文档进行预处理并保存索引以供以后快速搜索。ByteHouse 云数仓版通过增加文本倒排索引的能力,来支持更快速的文本检索和过滤的方式。ByteHouse 云数仓版支持通过 SQL 语法来进行全文检索,本文将介绍如何创建全文索引并进行查询。
目前全文检索支持根据两种文本分词索引方式:
注意
全文检索服务启用后无法关闭,请谨慎操作。
详细配置费用信息请参见实际控制台界面显示。
开启路径:进入 ByteHouse 产品首页,首次购买 ByteHouse 云数仓版时,可在计算组模块,启用全文检索功能。
创建全文检索的基本语法举例如下,根据索引方式的不同,需要为 inverted() 中设置不同的值。
--建表时创建索引 CREATE TABLE table_with_ivt_idx ( key UInt64, str String, INDEX inv_idx(str) TYPE inverted() GRANULARITY 1 ) ENGINE = CnchMergeTree ORDER BY key; --建表后增加索引 ALTER TABLE {table_name} ADD INDEX {index_name} {column_to_index} TYPE {index_type_and_arguments} GRANULARITY {index_granularity}; --物化添加过的索引 ALTER TABLE {table_name} MATERIALIZE INDEX {index_name}; -- 从表定义中删除索引,并删除所有索引的数据 ALTER TABLE {table_name} DROP INDEX {index_name}; -- 保留表定义中的索引,但删除所有索引的数据 ALTER TABLE {table_name} CLEAR INDEX {index_name};
设置 inverted(0) 或者 inverted() 时,分词器将设置为“tokens”,即沿空格和标点符号分割字符串。
CREATE TABLE test_inverted_with_token ( key UInt64, doc String,-- low(doc) 只将 英文字母 转换为 小写后进行文本处理 INDEX doc_idx lower(doc) TYPE inverted GRANULARITY 1 -- 在不特殊指定时默认采用 Token 进行分词 ) ENGINE = CnchMergeTree() ORDER BY key;
设置为 inverted(N) 时,即是使用 N-gram 分词器,范围为[ 2 , 8 ]。
CREATE TABLE test_inverted_with_ngram ( key UInt64, doc String,-- low(doc) 只将 英文字母 转换为 小写后进行文本处理 INDEX doc_idx lower(doc) TYPE inverted(4) GRANULARITY 1-- 指定数字 4 代表采用 4-gram 对文本分词 ) ENGINE = CnchMergeTree() ORDER BY key;
数据库中包含某中文作品数据,通过 ngram 的方式建表导入测试。
-- 创建数据库 CREATE DATABASE test_gin; -- 创建原表 CREATE TABLE test_gin.ch_docs ( row UInt64, doc String ) ENGINE = CnchMergeTree ORDER BY row; -- 向原表中插入数据 INSERT INTO test_gin.ch_docs format CSVWithNames infile '/home/user/sample.csv'; -- 创建 2-gram 分词表 CREATE TABLE test_gin.ch_docs_ngram ( row UInt64, doc String, INDEX inv_idx doc TYPE inverted(2) GRANULARITY 1 ) ENGINE = CnchMergeTree ORDER BY row; -- 向 2-gram 分词表中插入数据 INSERT INTO test_gin.ch_docs_ngram format CSVWithNames infile '/home/user/sample.csv';
查询语句如下:
SELECT count() FROM test_gin.ch_docs WHERE doc LIKE '%数仓%'; SELECT count() FROM test_gin.ch_docs_ngram WHERE doc LIKE '%数仓%'; SELECT count() FROM test_gin.ch_docs WHERE doc LIKE '%云计算%'; SELECT count() FROM test_gin.ch_docs_ngram WHERE doc LIKE '%云计算%';
函数名 | 描述 |
|---|---|
| 检查字段值是否等于指定值。 |
| 检查字段值是否不等于指定值。 |
| 检查字段值是否匹配指定模式。 |
| 检查字段值是否不匹配指定模式。 |
| 检查字段值是否包含指定令牌。 |
| 检查字段值是否以指定前缀开头。 |
| 检查字段值是否以指定后缀结尾。 |
| 对字段的任意值使用指定的搜索词进行多搜索。 |
| 检查字段值是否不在指定值列表中。 |
| 检查字段值是否在指定值列表中。 |
函数名 | 功能描述 |
|---|---|
| 判断一个元素是否在给定的数组或集合中 |
| 判断给定的数组或集合中是否至少有一个元素满足指定的条件 |
| 检查一个数组或集合是否满足指定的条件 |