当前位置:   article > 正文

Elasticsearch SQL_elasticsearch sql查询

elasticsearch sql查询

一般使用 Elasticsearch 的时候,会使用 Query DSL 来查询数据,从 Elasticsearch6.3 版本以后,Elasticsearch 已经支持SQL查询了。

Elasticsearch SQL 是一个 X-Pack 组件,它允许针对 Elasticsearch 实时执行类似SQL的 查询。无论使用REST接口,命令行还是JDBC,任何客户端都可以使用SQLElasticsearch中的数据进行原生搜索和聚合数据。可以将 Elasticsearch SQL 看作是一种翻译器,它可以将 SQL翻译成 Query DSL

# Elasticsearch_SQL具有如下特性

  • 原生集成 Elasticsearch SQL 是为 Elasticsearch 从头开始​​构建的。每个查询都根据底层存储有效地针对相关节点执行。

  • 没有外部零件 无需额外的硬件、进程、运行时或库来查询 ElasticsearchElasticsearch SQL 通过在Elasticsearch 内部运行消除了额外的移动部件。

  • 轻巧高效 Elasticsearch SQL并未抽象化其搜索功能,相反的它拥抱并接受了SQL来 实现全文搜索,以简洁的方式实时运行全文搜索

  • 创建索引并增加数据,等同于创建表和数据
  1. PUT my-sql-index/_bulk?refresh
  2. {"index":{"_id": "JAVA"}}
  3. {"name": "JAVA", "author": "zhangsan", "release_date": "2022-08-10","page_count": 561}
  4. {"index":{"_id": "BIGDATA"}}
  5. {"name": "BIGDATA", "author": "lisi", "release_date": "2022-08-11", "page_count": 482}
  6. {"index":{"_id": "SCALA"}}
  7. {"name": "SCALA", "author": "wangwu", "release_date": "2022-08-12", "page_count": 604}

# 第一个SQL查询

  1. # SQL
  2. # 这里的表就是索引
  3. # 可以通过 format参数控制返回结果的格式,默认为 json格式
  4. # txt:表示文本格式,看起来更直观点.
  5. # csv:使用逗号隔开的数据
  6. # json:JSON格式数据
  7. # tsv: 使用 tab键隔开数据
  8. # yaml:属性配置格式
  9. POST _sql?format=txt
  10. {
  11. "query": """
  12. SELECT * FROM "my-sql-index"
  13. """
  14. }

# 条件查询

  1. # 条件查询
  2. POST _sql?format=txt
  3. {
  4. "query": """
  5. SELECT * FROM "my-sql-index" where page_count > 500
  6. """
  7. }

# SQL转换为DSL使用

当我们需要使用Query DSL时,也可以先使用SQL来查询,然后通过Translate API转换即可,查询的结果为DSL方式的结果

  1. # 转换 SQL为 DSL进行操作
  2. POST _sql/translate
  3. {
  4. "query": """
  5. SELECT * FROM "my-sql-index" where page_count > 500
  6. """
  7. }

# SQL和DSL混合使用

我们如果在优化SQL语句之后还不满足查询需求,可以拿SQLDSL 混用,ES会先根据SQL 进行查询,然后根据DSL语句对SQL的执行结果进行二次查询

  1. # SQL和 DSL混合使用
  2. # 由于索引中含有横线,所以作为表名时需要采用双引号,且外层需要三个引号包含
  3. POST _sql?format=txt
  4. {
  5. "query": """SELECT * FROM "my-sql-index" """,
  6. "filter" : {
  7. "range": {
  8. "page_count": {
  9. "gte": 400,
  10. "lte": 600
  11. }
  12. }
  13. },
  14. "fetch_size": 2
  15. }

# 常用SQL操作

# 查询所有索引

  1. GET _sql?format=txt
  2. {
  3. "query": """
  4. show tables
  5. """
  6. }

# 查询指定索引

  1. GET _sql?format=txt
  2. {
  3. "query": """
  4. show tables like 'my-sql-index'
  5. """
  6. }

# 模糊查询索引

  1. GET _sql?format=txt
  2. {
  3. "query": """
  4. show tables like 'my-%'
  5. """
  6. }

# 查看索引结构

  1. # 先创建一个索引
  2. put myindex
  3. {
  4. "mappings":{
  5. "properties":{
  6. "sku_id":{
  7. "type":"long"
  8. },
  9. "sku_name":{
  10. "type":"text"
  11. },
  12. "sku_url":{
  13. "type":"keyword"
  14. }
  15. }
  16. }
  17. }

  1. GET _sql?format=txt
  2. {
  3. "query": """
  4. describe myindex
  5. """
  6. }

# 基本查询操作

  • ES中使用SQL查询的语法与在数据库中使用基本一致

# where

  1. # 条件过滤
  2. POST _sql?format=txt
  3. {
  4. "query": """ SELECT * FROM "my-sql-index" where name = 'JAVA' """
  5. }

# group-by

  1. # 按照日期进行分组
  2. GET _sql?format=txt
  3. {
  4. "query": """
  5. SELECT release_date FROM "my-sql-index" group by release_date
  6. """
  7. }

# having

  1. # 对分组后的数据进行过滤
  2. GET _sql?format=txt
  3. {
  4. "query": """
  5. SELECT sum(page_count), release_date as datacnt FROM "my-sql-index" group by release_date having sum(page_count) > 1000
  6. """
  7. }

# order-by

  1. # 对页面数量进行排序(降序)
  2. GET _sql?format=txt
  3. {
  4. "query": """
  5. select * from "my-sql-index" order by page_count desc
  6. """
  7. }

# limit

  1. # 限定查询数量
  2. GET _sql?format=txt
  3. {
  4. "query": """
  5. select * from "my-sql-index" limit 3
  6. """
  7. }

# cursor

游标(cursor)是系统为用户开设的一个数据缓冲区,存储sql语句的执行结果,每个游标区都有一个名字,用户可以用 sql 语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条或多条记录的机制

  1. # 查询数据
  2. # 因为查询结果较多,但是获取的数据较少,所以为了提高效果,会将数据存储到临时缓冲区中
  3. # 此处数据展示格式为 json
  4. POST _sql?format=json
  5. {
  6. "query": """ SELECT * FROM "my-sql-index" order by page_count desc """,
  7. "fetch_size": 2
  8. }

返回结果中的cursor就是缓冲区的标识,这就意味着可以从缓冲区中直接获取后续数据,操作上有点类似于迭代器,可多次执行。

  1. # 此处游标cursor值就是上图中的结果
  2. POST /_sql?format=json
  3. {
  4. "cursor": "v5HqA0RGTACEkd9OwjAUxnvmQgwx8RF8BVG44IKLDew0YRCkUF1MljI6NigtrOVPeCIfwPfTbUDEK7+Lnu80PV+T34EAQYIsQIW+c92WDuVXUI1TLqahVpmprtiMh5HaSIMqYZxm2gAgsIWSs+N7+IIrZFm5KY4y4eNkUFHBrrCNSVSGLFuyJUfWZaZ1k3HBmebhlBkOd9pkaWTKJlQrkyrJRGjSJQ8lk0pb8AnbxvPa2T35k7eFiR6x7lKxCbxxHS/EfEh7a9pJ1NhrdklnqiORKCKSve9FDhaiPhnt7vsjHI/mbi2Yu+3goUEGFMdDGjlntZs+DQ4v+76HiX94JUwK/E5XPb/mpl0SkMHAcf/7y3FaLVQ9crUhPhEA2/C9yZHEJYnf9oLIGS3Ef8lcF0gKEPl4vqofAAAA//8DAA=="
  5. }

  • 如果执行后,无任何结果返回,说明数据已经读取完毕

  • 此时再次执行,会返回错误信息

  • 如果关闭缓冲区,执行下面指令即可

  1. POST _sql/close
  2. {
  3. "cursor": "v5HqA0RGTACEkUtuwjAQhj1phCpUqUfoFUoLCxYsEmjSSgREMbjNJjLBJgFjQ2we4kQ9QE/Ui7RJAJWu+i9G/4zmIX0DIYIEWYAKfee6LR3KS1DlKRPTSKvMVFd0xqJYbaRBlYinmTYACGyh5OzYD59whSwrN0UoK18ng4rtYFfoxiQqQ5Yt6ZIh63KndZMxwahm0ZQaBnfaZGlsyiRSK5MqSUVk0iWLJJVKW/AB28bz2tk9BZO3hYkfPd0lYhP647q3EPMh6a1JJ1Fjv9nFnamORaKwSPaBHzueEPXJaHffH3l8NHdr4dxthw8NPCAeH5LYOavdDEh4eNn3fQ8Hh1dMpfDeyaoX1Ny0i0M8GDjuf7ccp9VC1SNXG/iJANiG7U2OhJckftMLIme0wP+SuS6QFCDy8fxVPwAAAP//AwA="
  4. }

# 聚合操作

  • Min、Max、Avg、Sum、Count(*) 、Distinct
  1. GET _sql?format=txt
  2. {
  3. "query": """
  4. SELECT
  5. MIN(page_count) min,
  6. MAX(page_count) max,
  7. AVG(page_count) avg,
  8. SUM(page_count) sum,
  9. COUNT(*) count,
  10. COUNT(DISTINCT name) dictinct_count
  11. FROM "my-sql-index"
  12. """
  13. }

# 支持的函数和运算

# 比较运算符

  1. -- Equality
  2. SELECT * FROM "my-sql-index" WHERE name = 'JAVA'
  3. -- Null Safe Equality
  4. SELECT 'elastic' <=> null AS "equals"
  5. SELECT null <=> null AS "equals"
  6. -- Inequality
  7. SELECT * FROM "my-sql-index" WHERE name <> 'JAVA'
  8. SELECT * FROM "my-sql-index" WHERE name != 'JAVA'
  9. -- Comparison
  10. SELECT * FROM "my-sql-index" WHERE page_count > 500
  11. SELECT * FROM "my-sql-index" WHERE page_count >= 500
  12. SELECT * FROM "my-sql-index" WHERE page_count < 500
  13. SELECT * FROM "my-sql-index" WHERE page_count <= 500
  14. -- BETWEEN
  15. SELECT * FROM "my-sql-index" WHERE page_count between 100 and 500
  16. -- Is Null / Is Not Null
  17. SELECT * FROM "my-sql-index" WHERE name is not null
  18. SELECT * FROM "my-sql-index" WHERE name is null
  19. -- IN
  20. SELECT * FROM "my-sql-index" WHERE name in ('JAVA', 'SCALA')

# 逻辑运算符

  1. -- AND
  2. SELECT * FROM "my-sql-index" WHERE name = 'JAVA' AND page_count > 100
  3. -- OR
  4. SELECT * FROM "my-sql-index" WHERE name = 'JAVA' OR name = 'SCALA'
  5. -- NOT
  6. SELECT * FROM "my-sql-index" WHERE NOT name = 'JAVA'

# 数学运算符

  1. # 加减乘除
  2. select 1 + 1 as x
  3. select 1 - 1 as x
  4. select - 1 as x
  5. select 6 * 6 as x
  6. select 30 / 5 as x
  7. select 30 % 7 as x

# 类型转换

SELECT '123'::long AS long

复制代码

# 模糊查询

  1. -- LIKE 通配符
  2. SELECT * FROM "my-sql-index" WHERE name like 'JAVA%'
  3. SELECT * FROM "my-sql-index" WHERE name like 'JAVA_'
  4. -- 如果需要匹配通配符本身,使用转义字符
  5. SELECT * FROM "my-sql-index" WHERE name like 'JAVA/%' ESCAPE '/'
  6. -- RLIKE 不要误会,这里的 R表示的不是方向,而是正则表示式 Regex
  7. SELECT * FROM "my-sql-index" WHERE name like 'JAV*A'
  8. SELECT * FROM "my-sql-index" WHERE name rlike 'JAV*A'
  9. -- 尽管 LIKE在 Elasticsearch SQL 中搜索或过滤时是一个有效的选项,但全文搜索 MATCH和 QUERY 速度更快、功能更强大,并且是首选替代方案。

# 聚合分析函数

  1. -- FIRST / FIRST_VALUE : FIRST(第一个字段,排序字段)
  2. SELECT first(name, release_date) FROM "my-sql-index"
  3. SELECT first_value(substring(name,2,1)) FROM "my-sql-index"
  4. -- LAST / LAST_VALUE : LAST (第一个字段,排序字段)
  5. SELECT last(name, release_date) FROM "my-sql-index"
  6. SELECT last_value(substring(name,2,1)) FROM "my-sql-index"
  7. -- KURTOSIS 量化字段的峰值分布
  8. SELECT KURTOSIS(page_count) FROM "my-sql-index"
  9. -- MAD
  10. SELECT MAD(page_count) FROM "my-sql-index"

# 分组函数

  1. -- HISTOGRAM : 直方矩阵
  2. SELECT HISTOGRAM(page_count, 100) as c,count(*) FROM "my-sql-index" group by c

# 数学通用函数

  1. -- ABS:求数字的绝对值
  2. select ABS(page_count) from "myindex" limit 5
  3. -- CBRT:求数字的立方根,返回 double
  4. select page_count v,CBRT(page_count) cbrt from "myindex" limit 5
  5. -- CEIL:返回大于或者等于指定表达式最小整数(double)
  6. select page_count v,CEIL(page_count) from "myindex" limit 5
  7. -- CEILING:等同于 CEIL
  8. select page_count v,CEILING(page_count) from "myindex" limit 5
  9. -- E:返回自然常数 e(2.718281828459045)
  10. select page_count,E(page_count) from "myindex" limit 5
  11. -- ROUND:四舍五入精确到个位
  12. select ROUND(-3.14)
  13. -- FLOOR:向下取整
  14. select FLOOR(3.14)
  15. -- LOG:计算以 2为底的自然对数
  16. select LOG(4)
  17. -- LOG10:计算以 10为底的自然对数
  18. select LOG10(100)
  19. -- SQRT:求一个非负实数的平方根
  20. select SQRT(9)
  21. -- EXP:此函数返回 e(自然对数的底)的 X次方的值
  22. select EXP(3)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/919310
推荐阅读
相关标签
  

闽ICP备14008679号