行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。

kafka扩分区对集群的影响???

回复

默认分类micheal 发起了问题 • 1 人关注 • 0 个回复 • 2118 次浏览 • 2018-05-21 17:51 • 来自相关话题

transportClient链接elasticsearch6.2.4报找不到可用节点

回复

Elasticsearchkobe 发起了问题 • 1 人关注 • 0 个回复 • 2467 次浏览 • 2018-05-21 17:18 • 来自相关话题

如何添加一个字段,新加字段是已有两个字段的商?

Logstashstrglee 回复了问题 • 3 人关注 • 1 个回复 • 2350 次浏览 • 2018-05-21 16:21 • 来自相关话题

elk统计两个字段的和

Elasticsearchzhao_rd 回复了问题 • 3 人关注 • 2 个回复 • 5316 次浏览 • 2018-05-21 15:45 • 来自相关话题

字符串提取提示grokparsefailure

Logstashstrglee 回复了问题 • 2 人关注 • 1 个回复 • 1666 次浏览 • 2018-05-21 14:32 • 来自相关话题

ES权威指南-取回一个文档疑问,求大神解答

Elasticsearchbill 回复了问题 • 4 人关注 • 2 个回复 • 2553 次浏览 • 2018-05-21 14:09 • 来自相关话题

Elastic Podcast 第二期,嘉宾:吴晓刚/胡航@Ctrip

Podcastmedcl 发表了文章 • 14 个评论 • 3342 次浏览 • 2018-05-21 12:30 • 来自相关话题


banner.jpg

 Elastic Podcast 第二期来啦, 这一次我们来到了位于上海的携程旅行网,携程内部大量运用了 Elasticsearch 来进行集中式的运维日志管理和为业务部门提供统一的搜索服务平台,目前线上总共部署了多达 94 个 Elasticsearch 集群和超过 700 多个 Elasticsearch 节点,每天新增日志 1600 亿条,峰值达到 300 万每秒,存放在 Elasticsearch 里面的索引文档达到 2.5 万亿,磁盘存储达到 PB 级。想知道携程是如何应对这些海量数据下的挑战,以及最佳实践,让我们一起来收听这一期的 Podcast,跟随携程的两位技术负责人吴晓刚和胡航来一探究竟。


主持人:

Elastic 技术布道师,曾勇(Medcl)。


嘉宾:

吴晓刚,携程技术保障部系统研发总监, Elasticsearch 国内早期实践者,中文社区活跃用户。 曾在 eBay, Morgan Stanley, PPTV 等国内外公司从事系统软件研发、系统集成与技术支持工作。对于大规模 IT 系统的运维自动化、可视化、性能优化具有浓厚的兴趣。在技术方面一直抱有知其然知其所以然的态度。


胡航,携程旅行网高级技术经理,负责相关搜索实现、SOA服务的开发。曾供职于腾讯、盛大等公司,对新技术持有强烈的好奇心,目前关注于 Elasticsearch 的业务实现、JVM 性能优化等。


可以点击下面的任意链接来收听(时长约 50 分钟):


往期:Elastic 在德比软件的使用


关于 Elastic Podcast

《Elastic Podcast》是由 Elastic 中文社区发起的一档谈话类的播客节目,节目会定期邀请 Elastic 开源软件的用户,一起来聊一聊围绕他们在使用 Elastic 开源软件过程中的各种话题,包括行业应用、架构案例、经验分享等等。
 

ctrip_podcast_pic.jpg

[胡航/吴晓刚/曾勇]

elasticsearch5.6.6,java,RestHighLevelClient,使用路由(routing)后更慢了

Elasticsearchxys2333 回复了问题 • 3 人关注 • 2 个回复 • 6367 次浏览 • 2018-05-21 10:54 • 来自相关话题

6.x使用 reindex失敗

Elasticsearchgentrice 回复了问题 • 3 人关注 • 2 个回复 • 4405 次浏览 • 2018-05-21 10:50 • 来自相关话题

是在这个位置加入新的索引的吗?

回复

Logstashxm110224 发起了问题 • 1 人关注 • 0 个回复 • 1575 次浏览 • 2018-05-21 10:32 • 来自相关话题

Kibana timelion始终是一条直线0

Kibanajinyebing 回复了问题 • 2 人关注 • 6 个回复 • 1582 次浏览 • 2018-05-21 10:30 • 来自相关话题

社区日报 第278期 (2018-05-21)

社区日报cyberdak 发表了文章 • 0 个评论 • 1258 次浏览 • 2018-05-21 09:24 • 来自相关话题

1.如何在linux上离线安装es TLS配置。
http://t.cn/R3EorzN

2.谈谈ES 的Recovery。
https://elasticsearch.cn/article/38

3.如何让es集群崩溃?学会好了这些你就可以避免集群崩溃了
http://t.cn/RQxkfQH 

编辑:cyberdak
归档:https://elasticsearch.cn/article/630
订阅:https://tinyletter.com/elastic-daily
 

Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

Elasticsearchrockybean 发表了文章 • 2 个评论 • 16428 次浏览 • 2018-05-21 07:45 • 来自相关话题

有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQL 来实现,然后再去想 Elasticsearch 的 Query DSL 如何实现。那么本篇就给大家讲一条常见的 SQL 语句如何用 Elasticsearch 的查询语言实现。



1. SQL语句


假设我们有一个汽车的数据集,每个汽车都有车型、颜色等字段,我希望获取颜色种类大于1个的前2车型。假设汽车的数据模型如下:

json<br /> {<br /> "model":"modelA",<br /> "color":"red"<br /> }<br />

假设我们有一个 cars 表,通过如下语句创建测试数据。

sql<br /> INSERT INTO cars (model,color) VALUES ('A','red'); <br /> INSERT INTO cars (model,color) VALUES ('A','white'); <br /> INSERT INTO cars (model,color) VALUES ('A','black'); <br /> INSERT INTO cars (model,color) VALUES ('A','yellow'); <br /> INSERT INTO cars (model,color) VALUES ('B','red'); <br /> INSERT INTO cars (model,color) VALUES ('B','white'); <br /> INSERT INTO cars (model,color) VALUES ('C','black'); <br /> INSERT INTO cars (model,color) VALUES ('C','red'); <br /> INSERT INTO cars (model,color) VALUES ('C','white'); <br /> INSERT INTO cars (model,color) VALUES ('C','yellow'); <br /> INSERT INTO cars (model,color) VALUES ('C','blue'); <br /> INSERT INTO cars (model,color) VALUES ('D','red');<br /> INSERT INTO cars (model,color) VALUES ('A','red'); <br />

那么实现我们需求的 SQL 语句也比较简单,实现如下:

sql<br /> SELECT model,COUNT(DISTINCT color) color_count FROM cars GROUP BY model HAVING color_count > 1 ORDER BY color_count desc LIMIT 2;<br />

这条查询语句中 Group By 是按照 model 做分组, Having color_count>1 限定了车型颜色种类大于1,ORDER BY color_count desc 限定结果按照颜色种类倒序排列,而 LIMIT 2 限定只返回前3条数据。

那么在 Elasticsearch 中如何实现这个需求呢?

2. 在 Elasticsearch 模拟测试数据


首先我们需要先在 elasticsearch 中插入测试的数据,这里我们使用 bulk 接口 ,如下所示:

<br /> POST _bulk<br /> {"index":{"_index":"cars","_type":"doc","_id":"1"}}<br /> {"model":"A","color":"red"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"2"}}<br /> {"model":"A","color":"white"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"3"}}<br /> {"model":"A","color":"black"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"4"}}<br /> {"model":"A","color":"yellow"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"5"}}<br /> {"model":"B","color":"red"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"6"}}<br /> {"model":"B","color":"white"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"7"}}<br /> {"model":"C","color":"black"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"8"}}<br /> {"model":"C","color":"red"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"9"}}<br /> {"model":"C","color":"white"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"10"}}<br /> {"model":"C","color":"yellow"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"11"}}<br /> {"model":"C","color":"blue"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"12"}}<br /> {"model":"D","color":"red"}<br /> {"index":{"_index":"cars","_type":"doc","_id":"13"}}<br /> {"model":"A","color":"red"}<br />

其中 index 为 cars,type 为 doc,所有数据与mysql 数据保持一致。大家可以在 Kibana 的 Dev Tools 中执行上面的命令,然后执行下面的查询语句验证数据是否已经成功存入。

<br /> GET cars/_search<br />

3. Group By VS Terms/Metric Aggregation


SQL 中 Group By 语句在 Elasticsearch 中对应的是 Terms Aggregation,即分桶聚合,对应 Group By color 的语句如下所示:

json<br /> GET cars/_search<br /> {<br /> "size":0,<br /> "aggs":{<br /> "models":{<br /> "terms":{<br /> "field":"model.keyword"<br /> }<br /> }<br /> }<br /> }<br />

结果如下:

json<br /> {<br /> "took": 161,<br /> "timed_out": false,<br /> "_shards": {<br /> "total": 5,<br /> "successful": 5,<br /> "skipped": 0,<br /> "failed": 0<br /> },<br /> "hits": {<br /> "total": 13,<br /> "max_score": 0,<br /> "hits": []<br /> },<br /> "aggregations": {<br /> "models": {<br /> "doc_count_error_upper_bound": 0,<br /> "sum_other_doc_count": 0,<br /> "buckets": [<br /> {<br /> "key": "A",<br /> "doc_count": 5<br /> },<br /> {<br /> "key": "C",<br /> "doc_count": 5<br /> },<br /> {<br /> "key": "B",<br /> "doc_count": 2<br /> },<br /> {<br /> "key": "D",<br /> "doc_count": 1<br /> }<br /> ]<br /> }<br /> }<br /> }<br />

我们看 aggregations 这个 key 下面的即为返回结果。

SQL 语句中还有一项是 COUNT(DISTINCT color) color_count 用于计算每个 model 的颜色数,在 Elasticsearch 中我们需要使用一个指标类聚合 Cardinality ,进行不同值计数。语句如下:

sql<br /> GET cars/_search<br /> {<br /> "size": 0,<br /> "aggs": {<br /> "models": {<br /> "terms": {<br /> "field": "model.keyword"<br /> },<br /> "aggs": {<br /> "color_count": {<br /> "cardinality": {<br /> "field": "color.keyword"<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br />

其返回结果如下:

json<br /> {<br /> "took": 74,<br /> "timed_out": false,<br /> "_shards": {<br /> "total": 5,<br /> "successful": 5,<br /> "skipped": 0,<br /> "failed": 0<br /> },<br /> "hits": {<br /> "total": 13,<br /> "max_score": 0,<br /> "hits": []<br /> },<br /> "aggregations": {<br /> "models": {<br /> "doc_count_error_upper_bound": 0,<br /> "sum_other_doc_count": 0,<br /> "buckets": [<br /> {<br /> "key": "A",<br /> "doc_count": 5,<br /> "color_count": {<br /> "value": 4<br /> }<br /> },<br /> {<br /> "key": "C",<br /> "doc_count": 5,<br /> "color_count": {<br /> "value": 5<br /> }<br /> },<br /> {<br /> "key": "B",<br /> "doc_count": 2,<br /> "color_count": {<br /> "value": 2<br /> }<br /> },<br /> {<br /> "key": "D",<br /> "doc_count": 1,<br /> "color_count": {<br /> "value": 1<br /> }<br /> }<br /> ]<br /> }<br /> }<br /> }<br />

结果中 color_count 即为每个 model 的颜色数,但这里所有的模型都返回了,我们只想要颜色数大于1的模型,因此这里还要加一个过滤条件。





4. Having Condition VS Bucket Filter Aggregation


Having color_count > 1 在 Elasticsearch 中对应的是 Bucket Filter 聚合,语句如下所示:

json<br /> GET cars/_search<br /> {<br /> "size": 0,<br /> "aggs": {<br /> "models": {<br /> "terms": {<br /> "field": "model.keyword"<br /> },<br /> "aggs": {<br /> "color_count": {<br /> "cardinality": {<br /> "field": "color.keyword"<br /> }<br /> },<br /> "color_count_filter": {<br /> "bucket_selector": {<br /> "buckets_path": {<br /> "colorCount": "color_count"<br /> },<br /> "script": "params.colorCount>1"<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br />

返回结果如下:

json<br /> {<br /> "took": 39,<br /> "timed_out": false,<br /> "_shards": {<br /> "total": 5,<br /> "successful": 5,<br /> "skipped": 0,<br /> "failed": 0<br /> },<br /> "hits": {<br /> "total": 13,<br /> "max_score": 0,<br /> "hits": []<br /> },<br /> "aggregations": {<br /> "models": {<br /> "doc_count_error_upper_bound": 0,<br /> "sum_other_doc_count": 0,<br /> "buckets": [<br /> {<br /> "key": "A",<br /> "doc_count": 5,<br /> "color_count": {<br /> "value": 4<br /> }<br /> },<br /> {<br /> "key": "C",<br /> "doc_count": 5,<br /> "color_count": {<br /> "value": 5<br /> }<br /> },<br /> {<br /> "key": "B",<br /> "doc_count": 2,<br /> "color_count": {<br /> "value": 2<br /> }<br /> }<br /> ]<br /> }<br /> }<br /> }<br />

此时返回结果只包含颜色数大于1的模型,但大家会发现颜色数多的 C 不是在第一个位置,我们还需要做排序处理。

5. Order By Limit VS Bucket Sort Aggregation


ORDER BY color_count desc LIMIT 3 在 Elasticsearch 中可以使用 Bucket Sort 聚合实现,语句如下所示:

sql<br /> GET cars/_search<br /> {<br /> "size": 0,<br /> "aggs": {<br /> "models": {<br /> "terms": {<br /> "field": "model.keyword"<br /> },<br /> "aggs": {<br /> "color_count": {<br /> "cardinality": {<br /> "field": "color.keyword"<br /> }<br /> },<br /> "color_count_filter": {<br /> "bucket_selector": {<br /> "buckets_path": {<br /> "colorCount": "color_count"<br /> },<br /> "script": "params.colorCount>1"<br /> }<br /> },<br /> "color_count_sort": {<br /> "bucket_sort": {<br /> "sort": {<br /> "color_count": "desc"<br /> },<br /> "size": 2<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br />

返回结果如下:

json<br /> {<br /> "took": 32,<br /> "timed_out": false,<br /> "_shards": {<br /> "total": 5,<br /> "successful": 5,<br /> "skipped": 0,<br /> "failed": 0<br /> },<br /> "hits": {<br /> "total": 13,<br /> "max_score": 0,<br /> "hits": []<br /> },<br /> "aggregations": {<br /> "models": {<br /> "doc_count_error_upper_bound": 0,<br /> "sum_other_doc_count": 0,<br /> "buckets": [<br /> {<br /> "key": "C",<br /> "doc_count": 5,<br /> "color_count": {<br /> "value": 5<br /> }<br /> },<br /> {<br /> "key": "A",<br /> "doc_count": 5,<br /> "color_count": {<br /> "value": 4<br /> }<br /> }<br /> ]<br /> }<br /> }<br /> }<br />

至此我们便将 SQL 语句实现的功能用 Elasticsearch 查询语句实现了。对比 SQL 语句与 Elasticsearch 的查询语句,大家会发现后者复杂了很多,但并非无章可循,随着大家对常见语法越来越熟悉,相信一定会越写越得心应手!

elasticsearch之空间数据、地理数据

回复

Elasticsearch匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 3182 次浏览 • 2018-05-20 16:26 • 来自相关话题