这批文章开始我们介绍下doris的扩展能力,这批主要介绍在doris上结合es的搜索能力,实现在doris中使用sql查询es的结果。在doris中,我们使用Doris On Elasticsearch其实主要是为了将doris的分布式查询能力和Elasticsearch的全文检索相结合,这样可以适应如下场景:
1、在Elasticsearch中做多个index的join操作 2、在Doris中使用Elasticsearch的全文检索功能。
下面演示一下。
一、搭建一个Es环境
这里我们暂时不介绍了,可参考这批文章《Elasticsearch介绍(二)Elasticsearch 集群安装》。
这里我们已经搭建好了,如下图:
二、在elasticsearch上创建一个user的mapping
PUT users { "settings": { "index": { "number_of_shards": "1", "number_of_replicas": "0" } }, "mappings": { "properties": { "id": { "type": "long" }, "name": { "type": "keyword" }, "age": { "type": "integer" }, "cts": { "type": "date" } } } }
三、向elasticsearch中的users索引里面插入几条数据
POST users/_doc/1 { "name":"张三","age": 15, "cts": "2022-11-14"} POST users/_doc/2 {"name": "李四", "age": 16,"cts": "2022-11-14"} POST users/_doc/3 {"name": "王五", "age": 17,"cts": "2022-11-14"} POST users/_doc/4 { "name":"赵六","age": 18, "cts": "2022-11-14"} POST users/_doc/5 { "name":"田七","age": 19, "cts": "2022-11-14"}
此时我们就把数据给插入进去了
四、在doris中创建外部表
CREATE EXTERNAL TABLE `users` ( `id` int(11) COMMENT "唯一id", `name` varchar(20) COMMENT "姓名", `age` int(3) COMMENT "年龄", `cts` datetime COMMENT "创建时间" ) ENGINE=ELASTICSEARCH PROPERTIES ( "hosts" = "http://192.168.0.236:9200", "index" = "users", "type" = "_doc", "user" = "", "password" = "" );
这里我们执行这条sql创建一个外部表,这是在doris的命令行里面创建的。
这里我们介绍下这个sql相关的含义
1)CREATE EXTERNAL TABLE `users`
这是在doris中创建一张名为users表的外部表,在doris中所有的外部表都需要使用EXTERNAL 关键词修饰。所谓的外部表的含义就是表的数据不存在于doris中,而是其他的数据库中。
2)ENGINE=ELASTICSEARCH
这里的引擎必须是ELASTICSEARCH,因为我们使用的就是elasticsearch作为外部的存储。
3)PROPERTIES
这里主要是elasticsearch的链接信息。根据实际情况进行填写即可。
五、测试查询一下
我们doris中直接使用sql命令进行查询结果,例如查询所有的数据:
select * from users;
可以看到我们可以直接在doris中查询出来elastcsearch的数据。
备注:这里大家可能不太明白,为什么没有id呢?因为在elastcsearch中,所有的Document_id都是用_id表示的例如:
所以说这里的_id无法映射到里面去,如果需要查出来id的话,
第一个解决方案是:
我们可以在elastcsearch中再增加一个id的字段,这样比较方便。
第二个解决方案是在doris中创建表的时候使用_id对应上,并且类型使用varchar即可,改造后的sql语句如下:
CREATE EXTERNAL TABLE `users` ( `_id` varchar COMMENT "唯一id", `name` varchar COMMENT "姓名", `age` int COMMENT "年龄", `cts` datetime COMMENT "创建时间" ) ENGINE=ELASTICSEARCH PROPERTIES ( "hosts" = "http://192.168.0.236:9200", "index" = "users", "type" = "_doc", "user" = "", "password" = "" );
备注:
1、这里的_id只能是varchar类型,不能使用int类型或者其他类型,不然查询的话值不对。
2、这里的varchar类型不能写长度,例如编写varchar(255)这种是会报错的,所以我们直接填写varchar即可。
3、在进行sql查询的时候,_id只能应用于等于和in这两种查询条件上。
关于doris on elasticsearch的演示案例就介绍到这里。下面再介绍下关于doris on elastcsearch的高级用法。
1)在doris中启动elastcsearch的列式扫描能力
在doris中存储有行存储,也有列存储,一般我们日常使用的从_source里面拿结果的都是行存储,如果开启了doc_value=true的话,则就会进行列存储。在Elasticsearch中使用列存储,那么取结果的话会非常快。所以在doris中我们尽量开启Elasticsearch的列式扫描。开启的话只需要在创建表的时候添加如下属性:
"enable_docvalue_scan" = "true"
例如我们修改下刚才的users外部表
CREATE EXTERNAL TABLE `users` ( `id` int(11) COMMENT "唯一id", `name` varchar(20) COMMENT "姓名", `age` int(3) COMMENT "年龄", `cts` datetime COMMENT "创建时间" ) ENGINE=ELASTICSEARCH PROPERTIES ( "hosts" = "http://192.168.0.236:9200", "index" = "users", "type" = "_doc", "user" = "", "password" = "", "enable_docvalue_scan" = "true" );
备注:
1、在doris中开启列式扫描,如果elastcsearch没有使用列存储,那么doris会自动去行存储里面查找结果。
2、elastcsearch中字段类型卫text的类型的,由于需要分词,因此不能使用列存储。
2)开启节点发现
这块主要是我们再创建表的时候可能只写一个节点地址,doris会自动探测集群的其他节点,开启的配置是:
"nodes_discovery" = "true"
例如上面的uses表我们可以修改如下:
CREATE EXTERNAL TABLE `users` ( `id` int(11) COMMENT "唯一id", `name` varchar(20) COMMENT "姓名", `age` int(3) COMMENT "年龄", `cts` datetime COMMENT "创建时间" ) ENGINE=ELASTICSEARCH PROPERTIES ( "hosts" = "http://192.168.0.236:9200", "index" = "users", "type" = "_doc", "user" = "", "password" = "", "enable_docvalue_scan" = "true", "nodes_discovery" = "true" );
3)探测keyword类型字段
这里主要是针对elastcsearch的text类型的字段进行探测,获取未分词的字段。配置如下:
"enable_keyword_sniff" = "true"
例如上面的users表的话,我们改造语句如下:
CREATE EXTERNAL TABLE `users` ( `id` int(11) COMMENT "唯一id", `name` varchar(20) COMMENT "姓名", `age` int(3) COMMENT "年龄", `cts` datetime COMMENT "创建时间" ) ENGINE=ELASTICSEARCH PROPERTIES ( "hosts" = "http://192.168.0.236:9200", "index" = "users", "type" = "_doc", "user" = "", "password" = "", "enable_docvalue_scan" = "true", "nodes_discovery" = "true", "enable_keyword_sniff" = "true" );
4)在doris中使用的时间类型
这块在elastcsearch中,我们队时间类型限制不高,但是如果需要结合doris的话,需要在elastcsearch中创建mapping的时候需要指定下对应的格式,例如:
"cts": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }
在doris中目前仅支持这两种格式,所以最好我们把格式固定住。
还没有评论,来说两句吧...