云原生多模数据库 Lindorm宽表引擎推出一种新的索引类型,称为搜索索引(SearchIndex)。本文介绍使用开源HBase API和Elasticsearch API访问并使用搜索索引。
背景信息
搜索索引通过融合Lindorm宽表引擎(兼容开源HBase API)和Lindorm搜索引擎(兼容开源Elasticsearch API)对外提供统一易用的访问接口,可以满足丰富的查询需求。标准使用方式是通过Lindorm SQL,为了方便更多的用户,也可以通过开源客户端使用搜索索引,有关搜索索引的具体介绍请参见搜索索引介绍。
如果您是通过Lindorm SQL创建的表,请通过SQL API使用搜索索引。
前提条件
已安装Java环境,要求安装JDK 1.8及以上版本。
已将客户端IP添加至Lindorm白名单中,具体操作请参见设置白名单。
操作步骤概览
操作步骤
使用SQL创建搜索索引(推荐)
对于通过HBase API创建的表,也可以使用Lindorm SQL创建搜索索引。通过此方式创建搜索索引流程更便捷,同时也支持开源客户端访问。
进入Lindorm Shell访问环境,具体操作请参见通过Lindorm Shell访问宽表引擎。
在Lindorm Shell创建宽表,表名为
testTable
。create 'testTable', {NAME => 'f'}
通过Lindorm SQL映射宽表列。
ALTER TABLE testTable MAP DYNAMIC COLUMN f:name HSTRING;
更多数据类型的映射说明,请参见数据类型映射关系。
创建名为
idx
的搜索索引。CREATE INDEX idx USING SEARCH ON testTable (f:name);
在表
testTable
中插入一条数据。put 'testTable', 'row1', 'f:name', 'foo'
说明创建的搜索索引变为
ACTIVE
状态后,实时写入宽表中的数据将自动同步到索引表中。索引状态的查看方法,请参见SHOW INDEX。对于宽表中的历史数据,需要使用ALTER INDEX
语句重新构建。例如:ALTER INDEX idx ON test REBUILD;
,其中idx
为宽表搜索索引的索引名。详细的语法说明,请参见ALTER INDEX。查询索引数据。
通过搜索引擎查询索引数据,获取搜索索引表的主键ID。
说明搜索引擎索引表的名称由此规则拼接而成:
<命名空间名称>.<表名称>.<索引名称>
。搜索索引表的字段名称由以下规则拼接而成:
对应宽表的列族为
f
时,索引表字段名称为列名。例如,f:name
对应name
。对应宽表列的列族不为
f
时,索引表字段名为<列族名>_<列名>
。例如f1:name
对应f1_name
。
GET /default.testTable.idx/_search { "size": 10, "query": { "match": { "name": "foo" } } }
返回结果:
{ "took" : 4, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "default.testTable.idx", "_id" : "726f7731", "_score" : 1.0, "_source" : { "update_version_l" : 1720072175536 } } ] } }
从返回结果中获取搜索索引表的主键ID(_id)。
进入Lindorm Shell环境,执行以下命令查询宽表数据。通过SQL方式创建的搜索索引,宽表主键ID将会以HEX编码格式映射为搜索索引表主键,因此需要以HEX编码格式查询,具体请参考rowkeyFormatterType的参数说明。
get 'testTable', "\x72\x6f\x77\x31"
返回结果:
COLUMN CELL f:name timestamp=1644462597661, value=foo 1 row(s) Took 0.0942 seconds
使用Lindorm Shell创建搜索索引
进入Lindorm Shell访问环境,具体操作请参见通过Lindorm Shell访问宽表引擎。
在Lindorm Shell创建宽表,表名为
testTable
。create 'testTable', {NAME => 'f'}
在搜索引擎中创建索引表,索引表的表名为
democollection
。如何创建请参见连接指南。说明在搜索引擎中创建索引表时,若无获取具体字段值的需求,可将
_source
配置为false
,以减少不必要的资源占用。映射宽表列和索引列。例如将表
testTable
中的f:name
(列族为f,列名为name)这一列映射到索引表democollection
的name_s
这一列。在HBase Shell解压文件的
bin
目录中创建JSON文件(文件名为schema
),将以下代码复制至JSON文件中。{ "sourceNamespace": "default", "sourceTable": "testTable", "targetIndexName": "democollection", "indexType": "ES", "rowkeyFormatterType": "STRING", "fields": [ { "source": "f:name", "targetField": "name_s", "type": "STRING" } ] }
说明请确保列映射中的每一列在搜索引擎中均已显式定义,且列名、数据类型与列映射的一致。
JSON文件中的参数说明请参见配置列映射。
进入Lindorm Shell环境,执行以下命令完成宽表列和索引表列的映射关系。
alter_external_index 'testTable', 'schema.json'
说明关于宽表列和索引表列的映射管理操作请参见管理列映射。
在表
testTable
中写入一条数据。宽表和索引表的列映射关系配置完成后,实时写入宽表中的数据将自动同步到索引表中。对于宽表中的历史数据,需要手动执行全量构建索引才可以完成数据同步,具体操作请参见构建全量数据索引。put 'testTable', 'row1', 'f:name', 'foo'
查询索引数据。
通过搜索引擎查询索引数据,获取搜索索引表的主键ID。
GET /democollection/_search { "size": 10, "query": { "match": { "name_s": "foo" } } }
返回结果:
{ "took" : 4, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "democollection", "_id" : "row1", "_score" : 1.0, "_source" : { "update_version_l" : 1720072175536 } } ] } }
从返回结果中获取搜索索引表的主键ID(_id)。
根据列映射中定义的rowkeyFormatterType,使用对应方法将搜索索引表的主键ID转换为宽表主键
row1
,具体操作请参见rowkeyFormatterType的参数说明。本示例使用STRING映射格式,搜索索引表的主键ID和宽表主键一致。进入Lindorm Shell环境,执行以下命令查询宽表数据。
get 'testTable','row1'
返回内容如下:
COLUMN CELL f:name timestamp=1644462597661, value=foo 1 row(s) Took 0.0942 seconds
通过LTS页面查看实时数据的同步任务状态。宽表和索引表的列映射关系配置完成后,实时写入宽表中的数据将自动同步到索引表中。
登录LTS操作页面。在Lindorm控制台上单击目标实例ID,左侧导航栏选择
,在数据同步管理 UI后单击ClusterManager公网或ClusterManager专有网络。左侧导航栏选择
。说明实时数据同步的延迟指标可以通过云监控控制台设置,最大任务延迟的报警阈值可以设置为600000毫秒,具体操作请参见云产品监控。