Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch (2)

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') 地理查询

Elasticsearch 可以把地理位置、全文搜索、结构化搜索和分析结合到一起。而Elasticsearch-sql 也基本支持所有地理位置相关的查询,对应 Elasticsearch的章节内容为Geolocation。

1、地理坐标盒模型过滤器

地理坐标盒模型过滤器(Geo Bounding Box Filter),指定一个矩形的顶部,底部,左边界和右边界,然后过滤器只需判断坐标的经度是否在左右边界之间,纬度是否在上下边界之间。

语法:

GEO_BOUNDING_BOX(fieldName,topLeftLongitude,topLeftLatitude,bottomRightLongitude,bottomRightLatitude)

示例:

SELECT * FROM location WHERE GEO_BOUNDING_BOX(center,100.0,1.0,101,0.0)

2、地理距离过滤器

地理距离过滤器( geo_distance ),以给定位置为圆心画一个圆,来找出那些地理坐标落在指定距离范围的文档。

语法:

GEO_DISTANCE(fieldName,distance,fromLongitude,fromLatitude)

示例:

SELECT * FROM location WHERE GEO_DISTANCE(center,'1km',100.5,0.5)

3、地理距离区间过滤器

范围距离过滤器(Range Distance filter),以给定位置为圆心,分别以两个给定的距离画圆,找出与指定点距离在给定最小距离和最大距离之间的点,和geo_distance filter的唯一差别在于Range Distance filter是一个环状的,它会排除掉落在内圈中的那部分文档。

语法:

GEO_DISTANCE_RANGE(fieldName,distanceFrom,distanceTo,fromLongitude,fromLatitude)

示例:

SELECT * FROM location WHERE GEO_DISTANCE_RANGE(center,'1m','1km',100.5,0.50001)

4、Polygon filter (works on points)

找出落在多边形中的点。 这个过滤器使用代价很大 。当你觉得自己需要使用它,最好先看看 geo-shapes 。

语法:

GEO_POLYGON(fieldName,lon1,lat1,lon2,lat2,lon3,lat3,...)

示例:

SELECT * FROM location WHERE GEO_POLYGON(center,100,0,100.5,2,101.0,0)

5、GeoShape Intersects filter (works on geoshapes)

这里需要使用WKT表示查询时的形状。
语法:

GEO_INTERSECTS(fieldName,'WKT')

示例:

SELECT * FROM location WHERE GEO_INTERSECTS(place,'POLYGON ((102 2, 103 2, 103 3, 102 3, 102 2))

更多关于地理的查询可以参考这里。

实战用法

我们以本系列的第一篇教程中我们创建的索引 nba来作示例,如下:

1、查询 nba 所有球队信息

:9200/_sql?sql=select * from nba limit 10

查询结果:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

2、查询当家球星是詹姆斯的球队信息

:9200/_sql?sql=select * from nba where topStar = "勒布朗·詹姆斯"

查询结果:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

3、根据建队时间降序排列

:9200/_sql?sql=select * from nba order by date desc

查询结果:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

4、查询拥有总冠军超过5个的球队信息

:9200/_sql?sql=select * from nba where championship >= 5

查询结果:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

5、查询总冠军数量分别在1-5,5-10,10-15,15-20范围之间球队的数量

:9200/_sql?sql=SELECT COUNT(championship) FROM nba GROUP BY range(championship, 1,5,10,15,20)

查询结果:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

当然还有更多的写法,具体实现在这里就不多诉了,感兴趣的读者可以自己搭建个项目然后尝试下,更多特色SQL写法可以参考这里:

基本条件查询

地理查询

聚合查询

额外SQL功能

Scan and scroll

功能有限的连接查询

Show Commands

Script Fields

NestedTypes support

Union & Minus support

Java实现

上面已经介绍了 Elasticsearch-SQL的安装和使用,那么我们如何在项目中使用它,Elasticsearch-SQL底层是使用Java语言开发的,通过解析SQL 转换为 DSL 语言,然后得出查询结果,解析结果成key-value的固定格式返回。

引入依赖

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwypgz.html