将Elastisearch插件转化为SQL查询可用的功能

在使用Elasticsearch时,无法避免使用标准的结构化查询(Structured Query Language,简称DSL)。然而,这种JSON格式的DSL本来就是为机器理解而设计的…对于人类来说非常困难。每当嵌套层级增加时,需要上下移动,并且需要仔细检查括号的配对。你是否曾经想过,如果可以使用熟悉的SQL进行查询将会多么方便!好消息是,有这样一个方便的插件存在。

elasticsearch-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仍然没有消亡,这是因为它是本质的原因,不是吗?

广告
将在 10 秒后关闭
bannerAds