将Elastisearch插件转化为SQL查询可用的功能
在使用Elasticsearch时,无法避免使用标准的结构化查询(Structured Query Language,简称DSL)。然而,这种JSON格式的DSL本来就是为机器理解而设计的…对于人类来说非常困难。每当嵌套层级增加时,需要上下移动,并且需要仔细检查括号的配对。你是否曾经想过,如果可以使用熟悉的SQL进行查询将会多么方便!好消息是,有这样一个方便的插件存在。
引入elasticsearch-sql
仅需要一种选项:Elasticsearch插件的安装只需一条命令即可完成,非常简单。请注意,根据ES的版本,二进制文件有所不同。安装后需要重新启动ES。
- Elasticsearch 1.X
./bin/plugin -u https://github.com/NLPchina/elasticsearch-sql/releases/download/1.4.7/elasticsearch-sql-1.4.7.zip –install sql
一种选项:./bin/plugin -u https://github.com/NLPchina/elasticsearch-sql/releases/download/1.4.7/elasticsearch-sql-1.4.7.zip –install sql
- Elasticsearch 2.0.0
安装插件时,请使用以下链接:https://github.com/NLPchina/elasticsearch-sql/releases/download/2.0.2/elasticsearch-sql-2.0.2.zip,并确保能够成功运行。
- Elasticsearch 2.1.0
请安装以下插件:./bin/plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.1.0/elasticsearch-sql-2.1.0.zip
基本的用法
这个插件可以通过网络用户界面来访问,也可以使用GET方法的查询字符串来访问。网络界面的URL在这里。
http://本地主机:9200/_plugin/sql/
使用GET方法的查询字符串进行查询的方法如下。
http://localhost:9200/_sql?sql=从indexName中选择*,限制为10条。
还可以将SQL转换为ES的DSL并进行显示。
http://localhost:9200/_sql/_explain?sql=从indexName中选择10个数据
SQL的示例
- 簡単なSELECT文
SELECT * FROM bank WHERE age >30 AND gender = 'm'
索引和文件通过/进行分隔。我认为在索引的通配符中经常使用*,但可以直接写入而无需使用引号。当包含空格时,用反引号括起来。据说MySQL解析器在这方面是基于的。
SELECT `field with space` FROM my-index-*/my-doc WHERE age >30 AND gender = 'm'
- GROUP BYを使ったSELECT文
select COUNT(*),SUM(age),MIN(age) as m, MAX(age),AVG(age)
FROM bank GROUP BY gender ORDER BY SUM(age), m DESC
- DELETE文
DELETE FROM bank WHERE age >30 AND gender = 'm'
根据Elasticsearch进行的扩展SQL
为了释放ES的能力,该程序装备了调用ES特有功能的函数。如果你使用Elasticsearch,你可能会知道这是指什么。
匹配查询
SELECT address FROM bank WHERE address = matchQuery('880 Holmes Lane') ORDER BY _score DESC LIMIT 3
合并了范围查询和聚合操作的技巧。
- ageフィールドを年齢層でグループ化して、カウント。
SELECT COUNT(age) FROM bank GROUP BY range(age, 20,25,30,35,40)
- date_histogramアグリゲーションを使って日次の集計
SELECT online FROM online GROUP BY date_histogram(field='insert_time','interval'='1d')
range date group by your config
SELECT online FROM online GROUP BY date_range(field='insert_time','format'='yyyy-MM-dd' ,'2014-08-18','2014-08-17','now-8d','now-7d','now-6d','now')
-
- ジオロケーションによる集約
- しっかりESの能力を引き出せていますね!
SELECT * FROM locations WHERE GEO_BOUNDING_BOX(fieldname,100.0,1.0,101,0.0)
其他功能
通过LIMIT/OFFSET进行分页,可以访问嵌套字段,虽然有限制,但也可以进行JOIN操作。需要注意的是,JOIN不是ES的功能,而是由此插件计算实现的。
SQL之時代~詩篇~
虽然NoSQL已经被响起了很久,但作为数据操作的共同语言,SQL正在重新审视。例如Spark SQL、Apache Drill和Presto都故意采用了SQL。SQL像函数式语言一样声明性且易于操作集合,因此作为一种语言,它是精练的。从执行计划创建有向图并向分布式环境查询是最近的架构。虽然我们已经迈出了一步,从Hive的map-reduce架构时代进步了一些,但SQL仍然没有消亡,这是因为它是本质的原因,不是吗?