一架梯子,一头程序猿,仰望星空!

Elasticsearch SQL入门教程


除了使用RESTful API查询Elasticsearch索引数据,也可以使用SQL语句查询索引数据,相信大部分人都使用过MYSQL,那么对SQL语句的语法结构肯定很熟悉了,下面介绍如何通过SQL语句查询ES数据。

提示: 需要安装X-Pack扩展组件,才可以让ES支持SQL查询,不过新版本的ES默认已经安装了X-Pack,老版本的ES可以检查下是否已经安装。

1.SQL和ES概念

在使用SQL查询ES数据之前,需要先了解下SQL和ES的概念映射关系。

SQLElasticsearch描述
columnfieldSQL中的列等价于ES中的字段
rowdocumentSQL中的一行数据等价于ES的一条文档
tableindexSQL的表跟ES中的索引名对应
schemaSQL中的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