除了使用RESTful API查询Elasticsearch索引数据,也可以使用SQL语句查询索引数据,相信大部分人都使用过MYSQL,那么对SQL语句的语法结构肯定很熟悉了,下面介绍如何通过SQL语句查询ES数据。
提示: 需要安装X-Pack扩展组件,才可以让ES支持SQL查询,不过新版本的ES默认已经安装了X-Pack,老版本的ES可以检查下是否已经安装。
1.SQL和ES概念
在使用SQL查询ES数据之前,需要先了解下SQL和ES的概念映射关系。
SQL | Elasticsearch | 描述 |
column | field | SQL中的列等价于ES中的字段 |
row | document | SQL中的一行数据等价于ES的一条文档 |
table | index | SQL的表跟ES中的索引名对应 |
schema | 无 | SQL中的schema通常指的就是数据库,在ES中没有这个概念,可以简单的认为ES中一个index就是一个数据库 |
2.例子
2.1.准备测试数据
下面创建一个library索引,插入一些测试数据。
PUT /library/_bulk?refresh
{"index":{"_id": "Leviathan Wakes"}}
{"name": "Leviathan Wakes", "author": "James S.A. Corey", "release_date": "2011-06-02", "page_count": 561}
{"index":{"_id": "Hyperion"}}
{"name": "Hyperion", "author": "Dan Simmons", "release_date": "1989-05-26", "page_count": 482}
{"index":{"_id": "Dune"}}
{"name": "Dune", "author": "Frank Herbert", "release_date": "1965-06-01", "page_count": 604}
2.2.执行SQL语句
我们可以直接通过REST API执行SQL语句,语法格式如下:
POST /_sql?format=txt
{
"query": "这里书写SQL语句"
}
format属性可以指定数据返回格式:txt 格式代表返回表格形式便于阅读,json格式代表返回Json格式便于数据处理。
执行例子
POST /_sql?format=txt
{
"query": "SELECT * FROM library WHERE release_date < '2000-01-01'"
}
格式说明
SELECT {查询字段} FROM {索引名} WHERE {查询条件}
执行结果:
author | name | page_count | release_date
---------------+---------------+---------------+------------------------
Dan Simmons |Hyperion |482 |1989-05-26T00:00:00.000Z
Frank Herbert |Dune |604 |1965-06-01T00:00:00.000Z