锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

0
  • 软件开发
  • 发布于 2024-08-10
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx 号 : 「liwu0213」
☠博主专栏 : <mysql 高手> <elasticsearch 高手> <源码解读> <java 核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的 coder,一起筑基

目录

      • 一、基本概念
      • 二、主要功能和优势
        • Elasticsearch SQL 特点
      • 三、启用和使用 SQL 功能
      • 四、Elasticsearch SQL 的使用
        • 4.1 语法
        • 4.2 sql 查询
        • 4.3 将 SQL 转换为 DSL
        • 4.4 全文检索
          • MATCH 函数
          • QUERY()
        • 4.5 分组统计
        • 4.6 DESCRIBE
        • 4.7 SHOW TABLES
        • 4.8 查询支持的函数
      • 五、适用场景及潜在限制

一、基本概念

Elasticsearch 是一个基于 Lucene 的开源、分布式、RESTful 搜索引擎。它提供了全文搜索、结构化搜索、分析以及分布式索引等功能。Elasticsearch SQL 是 Elasticsearch 的扩展功能,允许用户使用 SQL 语法查询 Elasticsearch 数据。通过 SQL 接口,开发者可以利用熟悉的 SQL 语言,编写更直观、更易懂的查询,并且避免对大量复杂的原生 REST 请求的编写。

[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-EupnvsbF-1721093861434)(https://i-blog.csdnimg.cn/direct/9e79724515584560a3ec575d33f54904.jpeg#pic_center)]

二、主要功能和优势

  1. 易用性:使用熟悉的 SQL 语法,降低了学习成本。
  2. 灵活性:支持复杂的查询和聚合操作。
  3. 性能:Elasticsearch 本身的分布式架构和高效查询引擎保证了查询性能。
  4. 集成性:通过 JDBC 驱动,可以与各种 SQL 工具和应用程序集成。
Elasticsearch SQL 特点

1. 本地集成
Elasticsearch SQL 是专门为 Elasticsearch 构建的。每个 SQL 查询都根据底层存储对相关节点有效执行。
2. 没有额外的要求
不依赖其他的硬件、进程、运行时库,Elasticsearch SQL 可以直接运行在 Elasticsearch 集群上
3. 轻量且高效
像 SQL 那样简洁、高效地完成查询

三、启用和使用 SQL 功能

要在 Elasticsearch 中启用和使用 SQL 功能,你需要安装 X-Pack 插件。X-Pack 插件包含了许多扩展功能,包括 SQL 接口。安装完成后,需要在 Elasticsearch 配置文件中启用 X-Pack 插件,并重启 Elasticsearch 服务。

# 安装X-Pack插件
./bin/elasticsearch-plugin install x-pack

# 启用X-Pack插件
# 在elasticsearch.yml配置文件中添加以下配置
xpack.sql.enabled: true

在启用 SQL 功能后,你可以通过 REST API、命令行工具或 JDBC 驱动来执行 SQL 查询。Elasticsearch SQL 的语法与标准的 SQL 语法非常相似,支持 SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY 等常见 SQL 语句。

四、Elasticsearch SQL 的使用

4.1 语法
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 ] [, ...] ) ) ]

[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-ZN8DC9ek-1721093861436)(https://i-blog.csdnimg.cn/direct/9dd378cca9294abcb6cecd3b49c3114a.png)]
目前 FROM 只支持单表

4.2 sql 查询
# 使用curl命令查询
curl -X GET "localhost:9200/_sql?format=txt" -H 'Content-Type: application/json' -d'
{
  "query": "SELECT * FROM indexName WHERE age > 30"
}'

format=txt 是指查询返回结果的数据格式

[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-i4AKhlnx-1721093861437)(https://i-blog.csdnimg.cn/direct/287895433292497ca6392411edf7ddff.png)]

4.3 将 SQL 转换为 DSL
GET /_sql/translate
{
"query":"SELECT * FROM es_order limit 1"
}

结果如下:

{
  "size" : 1,
  "_source" : {
    "includes" : [
      "id",
      "orderNo",
      "orderTime"
    ],
    "excludes" : [ ]
  },
  "docvalue_fields" : [
    {
      "field" : "id"
    },
    {
      "field" : "orderNo"
    },
    {
      "field" : "orderTime"
    }
  ],
  "sort" : [
    {
      "_doc" : {
        "order" : "asc"
      }
    }
  ]
}
4.4 全文检索

当使用 MATCH 或 QUERY 函数时,会启用全文搜索功能,SCORE 函数可以用来统计搜索评分。

MATCH 函数
MATCH(
    field_exp,   
    constant_exp 
    [, options]) 
field_exp:匹配字段
constant_exp:匹配常量表达式

用法:

GET /_sql?format=txt
{
"query":"select * from es_order where MATCH(address, '武汉') or MATCH(productType, '手机') limit 10"
}
QUERY()

使用 QUERY 函数查询 address 中包含 Street 的记录。

POST /_sql?format=txt
{
"query":"select id,orderNo,name,address,SCORE()  from es_order where QUERY('address: 武汉') limit 10"
}
4.5 分组统计
GET /_sql?format=txt
{
"query":"select city, count(*) as age_cnt from es_order group by city"
}

这种方式要更加直观、简洁。

HAVING
我们可以使用 HAVING 语句对分组数据进行二次筛选,比如筛选分组记录数量大于 1000 的信息,查询语句如下。

POST /_sql?format=txt
{
 "query":"select city, count(*) as age_cnt from es_order group by city having count(*) > 1000"
}

ORDER BY
使用 ORDER BY 语句对数据进行排序,比如按照统计字段从高到低排序,查询语句如下。

POST /_sql?format=txt
{
 "query":"select city, count(*) cc as age_cnt from es_order group by city having count(*) > 1000 order by cc "
}

注意: 目前 Elasticsearch SQL 还存在一些限制。例如:不支持 JOIN、不支持较复杂的子查询。所以,有一些相对复杂一些的功能,还得借助于 DSL 方式来实现

4.6 DESCRIBE

使用 DESCRIBE 语句查看索引中有哪些字段,比如查看 es_order 索引的字段,查询语句如下。

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

使用 SHOW TABLES 查看所有的索引

POST /_sql?format=txt
{
  "query": "SHOW TABLES"
}
4.8 查询支持的函数

使用 SQL 查询 ES 中的数据,不仅可以使用一些 SQL 中的函数,还可以使用一些 ES 中特有的函数。SHOW FUNCTIONS 语句查看所有支持的函数,比如搜索所有带有 DATE 字段的函数可以使用如下语句。

POST /_sql?format=txt
{
  "query": "SHOW FUNCTIONS LIKE '%DATE%'"
}

[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-eC2dU8qP-1721093861439)(https://i-blog.csdnimg.cn/direct/eed4483e4e4f4e43bdb5709b7d35b178.png)]

五、适用场景及潜在限制

Elasticsearch SQL 适用于需要对大量数据进行复杂查询的场景,如数据分析、报表生成、数据探索等。然而,由于 SQL 查询的复杂性,它可能不适用于所有场景。例如,对于需要高并发、低延迟的场景,原生 REST 查询可能更合适。

此外,虽然 Elasticsearch SQL 提供了 SQL 接口,但它并不是完全兼容 SQL。例如,它不支持所有的 SQL 函数和特性。因此,在使用 Elasticsearch SQL 时,需要了解它的限制,并根据实际情况选择使用。

总结来说,Elasticsearch SQL 提供了一种直观、易用的方式查询 Elasticsearch 数据。它允许开发者利用熟悉的 SQL 语言,编写更直观、更易懂的查询,并避免对大量复杂的原生 REST 请求的编写。然而,它的适用场景和性能特点需要在实际使用中仔细考虑。

关注公众号获取更多技术干货 !

标签: #软件开发 1171
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.