Lucene DataMap 可以使用下面的 DDL 创建
CREATE DATAMAP [IF NOT EXISTS] datamap_name
ON TABLE main_table
USING 'lucene'
DMPROPERTIES ('index_columns'='city, name', ...)
DataMap 可以使用下面的 DDL 删除:
DROP DATAMAP [IF EXISTS] datamap_name
ON TABLE main_table
使用下面命令显示所有的 DataMaps:
SHOW DATAMAP
ON TABLE main_table
上面命令将会显示所有创建在 main_table 上的所有 DataMaps 。
Lucene 是一个高性能,全文搜索引擎。 Lucene 作为索引数据映射集成到 carbon中,并由 CarbonData 与主表一起管理。用户可以创建 lucene 数据映射来提高拥有大量字符的字符串列的查询性能。因此,用户可以通过 lucene 查询文本内容来搜索标记化的词(tokenized word)或模式(pattern)。
比如我们有一张名为 datamap_test 的表,定义如下:
CREATE TABLE datamap_test (
name string,
age int,
city string,
country string)
STORED BY 'carbondata'
用户可以使用 Create DataMap DDL 来创建 Lucene datamap:
CREATE DATAMAP dm
ON TABLE datamap_test
USING 'lucene'
DMPROPERTIES ('INDEX_COLUMNS' = 'name, country',)
DMProperties
将数据加载到主表时,将为 DMProperties 中 index_columns(String Columns) 配置的所有列生成 lucene 索引文件,其中包含有关 index_columns 数据位置的信息。 这些索引文件将被写入每个段文件夹内名为 datamap 名称的文件夹内。
可以添加系统级配置 carbon.lucene.compression.mode
,以便对 lucene 索引文件进行最佳压缩。 默认值是 speed
,这样索引写入的速度会更快。 如果该值为 compression
,则索引文件将被压缩。
作为查询加速技术,Lucene 索引不能直接被查询,查询将在主表上进行。当使用 TEXT_MATCH('name:c10')
或 TEXT_MATCH_WITH_LIMIT('name:n10',10)
[第二个参数表示要返回的结果数时,如果用户未指定此值,则将返回所有结果] 查询时,将有两个作业被触发。第一个作业将包含 lucene 的搜索结果写入以表级别创建的文件夹中的临时文件里面,这些文件将在第二个作业中读取以提供更快的查询结果。一旦查询完成,这些临时文件将被清除。
用户可以通过执行 EXPLAIN
命令来验证查询是否利用 Lucene 数据映射,该命令将显示已转换的逻辑计划。因此用户可以检查 TEXT_MATCH()
过滤器是否被应用于查询。
注意:
TEXT_MATCH
或 TEXT_MATCH_WITH_LIMIT
中的过滤列必须始终为小写,过滤条件如 'AND','OR' 必须大写。
比如:
select * from datamap_test where TEXT_MATCH('name:*10 AND name:*n*')
查询仅支持一个 TEXT_MATCH
udf 作为过滤条件,而不支持多个 udfs。
下面的查询是支持的:
select * from datamap_test where TEXT_MATCH('name:*10 AND name:*n*')
下面的查询是不支持的:
select * from datamap_test where TEXT_MATCH('name:*10) AND TEXT_MATCH(name:*n*')
下面的查询可以转换为 text_match 查询,如下所示::
select * from datamap_test where name='n10'
select * from datamap_test where name like 'n1%'
select * from datamap_test where name like '%10'
select * from datamap_test where name like '%n%'
select * from datamap_test where name like '%10' and name not like '%n%'
Lucene TEXT_MATCH 查询:
select * from datamap_test where TEXT_MATCH('name:n10')
select * from datamap_test where TEXT_MATCH('name:n1*')
select * from datamap_test where TEXT_MATCH('name:*10')
select * from datamap_test where TEXT_MATCH('name:*n*')
select * from datamap_test where TEXT_MATCH('name:*10 -name:*n*')
注意: lucene 查询和语法, 请参见 lucene-syntax
一旦在主表上创建了 lucene 数据映射,就不支持在主表上执行以下命令:
UPDATE/DELETE
.ALTER TABLE DROP COLUMN
, ALTER TABLE CHANGE DATATYPE
,
ALTER TABLE RENAME
.注意: 支持添加新列,并且为了删除列和更改数据类型命令,CarbonData 将检查它是否会影响 lucene 数据映射;如果不影响,则允许操作,否则操作将被拒绝并抛出异常。
ALTER TABLE ADD/DROP PARTITION
.但是,仍然有办法在主表上执行这些操作,在当前 CarbonData 版本中,用户可以执行如下操作::
DROP DATAMAP
命令删除 lucene datamap。CREATE DATAMAP
命令创建 lucene datamap。基本上,用户可以手动触发来重新构建 datamap。