Elasticsearch适配器
有关下载和构建Calcite的说明,请参阅教程。
一旦成功编译项目,您可以在此处开始使用Calcite查询Elasticsearch。
首先,我们需要一个模型定义。该模型为Calcite提供了创建Elasticsearch适配器实例所需的参数。模型可以包含对材料化的定义。在模型定义中定义的表的名称对应于Elasticsearch中的索引。
以下是一个模型文件的基本示例:
{
"version": "1.0",
"defaultSchema": "elasticsearch",
"schemas": [
{
"type": "custom",
"name": "elasticsearch",
"factory": "org.apache.calcite.adapter.elasticsearch.ElasticsearchSchemaFactory",
"operand": {
"coordinates": "{'127.0.0.1': 9200}"
}
}
]
}
假设此文件保存为model.json,您可以通过sqlline连接到Elasticsearch,如下所示:
$ ./sqlline
sqlline> !connect jdbc:calcite:model=model.json admin admin
您还可以在模型定义中使用index和pathPrefix参数指定表示索引和路径前缀的索引名称和路径前缀:
...
"operand": {
"coordinates": "{'127.0.0.1': 9200}",
"index": "usa",
"pathPrefix": "path"
}
...
sqlline现在将接受访问您的Elasticsearch的SQL查询。
此适配器的目的是通过在可能的情况下直接在Elasticsearch中利用过滤和排序来将查询编译成最有效的Elasticsearch SEARCH JSON。
我们可以发出一个简单的查询,以获取存储在索引usa中的所有州的名称。
sqlline> SELECT * from "usa";
_MAP={pop=13367, loc=[-72.505565, 42.067203], city=EAST LONGMEADOW, id=01028, state=MA}
_MAP={pop=1652, loc=[-72.908793, 42.070234], city=TOLLAND, id=01034, state=MA}
_MAP={pop=3184, loc=[-72.616735, 42.38439], city=HATFIELD, id=01038, state=MA}
_MAP={pop=43704, loc=[-72.626193, 42.202007], city=HOLYOKE, id=01040, state=MA}
_MAP={pop=2084, loc=[-72.873341, 42.265301], city=HUNTINGTON, id=01050, state=MA}
_MAP={pop=1350, loc=[-72.703403, 42.354292], city=LEEDS, id=01053, state=MA}
_MAP={pop=8194, loc=[-72.319634, 42.101017], city=MONSON, id=01057, state=MA}
_MAP={pop=1732, loc=[-72.204592, 42.062734], city=WALES, id=01081, state=MA}
_MAP={pop=9808, loc=[-72.258285, 42.261831], city=WARE, id=01082, state=MA}
_MAP={pop=4441, loc=[-72.203639, 42.20734], city=WEST WARREN, id=01092, state=MA}
在执行此查询时,Elasticsearch适配器能够识别城市可以由Elasticsearch进行过滤,而州可以按升序由Elasticsearch进行排序。
提供给Elasticsearch的最终源JSON如下:
{
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"term": {
"city": "springfield"
}
}
]
}
}
}
},
"fields": [
"city",
"state"
],
"script_fields": {},
"sort": [
{
"state": "asc"
}
]
}
您还可以在没有事先视图定义的情况下查询Elasticsearch索引:
sqlline> SELECT _MAP['city'], _MAP['state'] from "elasticsearch"."usa" order by _MAP['state'];
Scrolling API的使用
对于没有聚合函数(如COUNT、MAX等)的查询,默认情况下,弹性适配器使用滚动API。这确保一致且完整的数据集以惰性和分批次的方式返回给最终用户。
请注意,当所有查询结果都被使用完时,滚动会自动清除(移除)。
支持的版本
目前,该适配器支持ElasticSearch版本6.x(或更新版本)。通常,我们尽量遵循官方的支持计划。此外,不支持类型(此适配器仅支持索引)。
参考资料
https://calcite.apache.org/docs/elasticsearch_adapter.html