ElasticSearch SQL:简介

来自Wikioe
跳到导航 跳到搜索


关于

除了使用 RESTful API 查询 Elasticsearch 索引数据,也可以使用 SQL 语句查询索引数据。


  • 需要安装 X-Pack 扩展组件,才可以让 ES 支持 SQL 查询。(新版本的 ES 默认已经安装了 X-Pack)

SQL 和 ES

SQL 和 ES 的概念映射关系:

SQL Elasticsearch 描述
column field SQL 中的列等价于 ES 中的字段
row document SQL 中的一行数据等价于 ES 的一条文档
table index SQL 的表跟 ES 中的索引名对应
schema SQL 中的 schema 通常指的就是数据库,在 ES 中没有这个概念,可以简单的认为 ES 中一个 index 就是一个数据库


SQL 语法:

SELECT select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ LIMIT [ count ] ]
[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ]
  • SQL 语法结构跟 MySQL 类似都是 SQL 标准语法结构,区别就是 SQL 标准的支持程度。


ES支持的SQL命令

SHOW COLUMNS

查询 ES 索引的字段和类型

语法:

SHOW COLUMNS [ FROM | IN ]?
    [table identifier | 
    [LIKE pattern] ]


示例:

POST /_sql?format=txt
{
    "query": "SHOW COLUMNS FROM library"
}

输出:

    column     |     type      |    mapping    
---------------+---------------+---------------
author         |VARCHAR        |text           
author.keyword |VARCHAR        |keyword        
name           |VARCHAR        |text           
name.keyword   |VARCHAR        |keyword        
page_count     |BIGINT         |long           
release_date   |TIMESTAMP      |datetime

SHOW TABLES

列出 ES 中所有索引


示例:

POST /_sql?format=txt
{
    "query": "SHOW TABLES"
}

输出:

          name          |     type      |     kind      
------------------------+---------------+---------------
.apm-agent-configuration|BASE TABLE     |INDEX          
.kibana                 |VIEW           |ALIAS          
.kibana_1               |BASE TABLE     |INDEX          
.kibana_task_manager    |VIEW           |ALIAS          
.kibana_task_manager_1  |BASE TABLE     |INDEX          
library                 |BASE TABLE     |INDEX          
order                   |BASE TABLE     |INDEX                 
shops                   |BASE TABLE     |INDEX

SHOW FUNCTIONS

展示 ES 支持的 SQL 函数


示例:

POST /_sql?format=txt
{
    "query": "SHOW FUNCTIONS"
}

输出:

      name       |     type      
-----------------+---------------
AVG              |AGGREGATE      
COUNT            |AGGREGATE      
FIRST            |AGGREGATE      
FIRST_VALUE      |AGGREGATE      
LAST             |AGGREGATE      
LAST_VALUE       |AGGREGATE      
MAX              |AGGREGATE      
MIN              |AGGREGATE      
SUM              |AGGREGATE      
KURTOSIS         |AGGREGATE     
.....忽略.....

ES执行SQL语句

可以直接通过 REST API 执行 SQL 语句,语法格式如下:

POST /_sql?format=txt
{
    "query": "这里书写SQL语句"
}

其中,format 属性可以指定数据返回格式:

  • txt 格式:返回表格形式,便于阅读;
  • json 格式:代表返回 Json 格式,便于数据处理。

语句说明:

SELECT {查询字段} FROM {索引名} WHERE {查询条件}


示例:

  1. 准备测试数据:
    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. 执行SQL语句:
    POST /_sql?format=txt
    {
        "query": "SELECT * FROM library WHERE release_date < '2000-01-01'"
    }
    
  3. 执行结果:
        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
    

全文搜索

ES SQL 语句中主要通过 MATCH 函数实现全文搜索。【SQL 中的“MATCH”函数!!!不是 ES 的“MATCH”关键字】

  • ES SQL 语法虽然支持 like 语句,但是 like 并不是使用全文搜索算法。

MATCH 函数

语法:

MATCH(
    field_exp,   
    constant_exp 
    [, options])

说明:

  1. field_exp:需要搜索的字段
  2. constant_exp:需要搜索的关键词
  3. options:可选参数


示例:查询 library 索引中 author 字段,匹配 frank 关键词的文档

POST /_sql?format=txt
{
    "query": "SELECT author, name FROM library WHERE MATCH(author, 'frank')"
}

返回结果:

    author     |     name      
---------------+---------------
Frank Herbert  |Dune

SQL相关度排序

通过 SCORE() 函数实现相关度排序。


示例:

POST /_sql?format=txt
{
    "query": "SELECT author, name FROM library WHERE MATCH(author, 'frank') ORDER BY SCORE()"
}


  • 也可以将相关度分数返回。

示例:

SELECT SCORE(), * FROM library WHERE MATCH(name, 'dune') ORDER BY SCORE() DESC;