Skip to content

🚀💎ElasticSearch SQL查询适配器,为Elasticsearch提供SQL查询的功能。支持跨集群查询,可拓展异构数据源。将calcite基于配置文件的配置方式改为通过代码灵活控制,可动态增加数据源,并支持完整的SQL查询功能。

License

hongshuboy/elasticsearch-sql-adapter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📝使用指南

ElasticSearchSQL查询适配器,为Elasticsearch提供SQL查询的功能。支持完整的SQL查询和跨Elasticsearch集群查询。通过代码简单配置,使项目根据Elasticsearchindex映射为Table

License CodeBeat Language Build Size Contributors
Hex.pm codebeat badge language java GitHub release (latest by date) GitHub repo size GitHub contributors

🚀效果展示

Elasticsearch上创建一个person索引,有四个字段name,age,address,room

select name,age,address,room from person
name age address room
zhangwei 26 shanghai 3602
yifei 25 shanghai 3601
youyou 24 sichuan 3602
lvziqiao 25 shanghai 3602
zengxiaoxian 26 shanghai 3601
meijia 24 shanghai 3601
guangu 26 dongjing 3602

🚀使用方法

在获得Connection之前先使用ElasticsearchTableManager设置要使用SQL管理的index索引,且通过ElasticsearchTableManager可动态的增加Table,这个过程是线程安全的。

//注册Driver
Class.forName("com.github.hongshuboy.adapter.elasticsearch.Driver");

//设置缺省状态下的Elasticsearch连接地址
ElasticsearchTableManager.setDefaultESHostAndPort("your es host", port);

//将index纳入SQL并设置index的schema
List<String> columns = Arrays.asList("name", "age", "address", "room");
List<FieldType> types = Arrays.asList(FieldType.STRING, FieldType.INT, FieldType.STRING, FieldType.INT);
//参数:index name/table alias/columns/types
ElasticsearchTableManager.createTable("person", "person", columns, types);

//get connection
Connection connection = DriverManager.getConnection("jdbc:hongshuboy:lex=JAVA");
Statement statement = connection.createStatement();

//execute query
ResultSet resultSet = statement.executeQuery("select * from person");
printResultSet(resultSet);

☑️ 看一下createTable方法

  • indexelasticsearch index

  • alias:table别名,SQL查询时使用的table name

  • columns:table columns,字段名需要与Elasticsearch一致

  • sqlTypes:字段类型

可以使用带有esHostport的重载方法指定来自另一个Elasticsearch集群的index

/**
 * add elasticsearch index to connection
 *
 * @param index    elasticsearch
 * @param alias    table alias name
 * @param columns  columns in index that you want to in table
 * @param sqlTypes table column types
 */
void createTable(String index, 
              String alias, 
              List<String> columns, 
              List<FieldType> sqlTypes) {
    //...
}

因为Elasticsearch不推荐,也以实际行动移除了type,所以这里考虑后还是使用index对应一个SQL表的对应关系

跨Elasticsearch集群

如果单集群添加表,为了避免麻烦,可以提前设置默认的集群连接,在不指定Elasticsearch连接地址的情况下,都会默认使用这里设置的连接地址

ElasticsearchTableManager.setDefaultESHostAndPort("your es host", port);

如果跨多个集群,可以使用带有esHostportcreateTable方法,这样一来,在SQL中就可以直接进行两表的join等操作

/**
 * @see ElasticsearchTableManager#createTable(String, String, List, List)
 */
public static void createTable(String esHost, int port, String index, String alias, List<String> columns, List<FieldType> sqlTypes) {
    assert columns.size() == sqlTypes.size();
    tableMetas.add(new TableMeta(esHost, port, index, alias, columns, sqlTypes));
}

关于Schema

查询时不需要指定数据库,直接使用table name即可

如果你添加了很多index,应该考虑使用alias区别

select name,age,address,room from person

条件查询

select * from person where age > 25
name age address room
zhangwei 26 shanghai 3602
zengxiaoxian 26 shanghai 3601
guangu 26 dongjing 3602

group by

select age,count(*) as num from person group by age
age num
24 2
25 2
26 3

🚀 其他如join查询等也都支持,可自行测试。

🙆‍♂️作者 Author

弘树丶

wangpeng(hongshu)

Email:hongshuboy@gmail.com

©️版权说明 License

本项目使用Apache License 2.0授权许可,详情请参阅 \LICENSE\NOTICE

hongshuboy/elasticsearch-sql-adapter is licensed under the Apache License 2.0,please read LICENSE and NOTICE for more information

Copyright ©2020 wangpeng(hongshu)

About

🚀💎ElasticSearch SQL查询适配器,为Elasticsearch提供SQL查询的功能。支持跨集群查询,可拓展异构数据源。将calcite基于配置文件的配置方式改为通过代码灵活控制,可动态增加数据源,并支持完整的SQL查询功能。

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages