es 结果排序

es 结果排序,第1张

以下是本次实战的环境信息,请确保您的Elasticsearch可以正常运行:

实战用的数据依然是一些汽车销售的记录,在 第一章 有详细的导入步骤,请参考 *** 作,导入后您的es中的数据如下图:

接下来一起实战聚合排序吧;

之前文章中的聚合查询,我们都没有做排序设置,此时es会用每个桶的doc_count字段做降序,下图是个terms桶聚合的示例,可见返回了三个bucket对象,是按照doc_count字段降序排列的:

除了自定义排序,es自身也内置了两种排序参数,可以直接拿来使用:

返回结果如下,已经按照key的大小从大到小排序:

《Elasticsearch 权威指南》 里指出:_key只在 histogram 和 date_histogram 内使用,原文如下图红框所示:

但是在实际 *** 作中发现,671版本中,除了histogram 和 date_histogram,terms桶也可以用_key排序,如下图,是按照key的字母降序:

把desc改为asc之后返回如下图,变成了按照key的首字母升序排序:

3 另外 《Elasticsearch 权威指南》 中还提到一种内置排序类型_term,但是 《Elasticsearch官方文档》 中宣布该类型在60之后已经废弃,如下:

也许是"手贱"的缘故,我还是用_term试了下,可以返回结果,但是会建议用_key替代_term,如下图:

常见的metrics有累加和(sum)、最大值(max)、最小值(min)、平均值(avg),这些metrics的特点是处理结果只有一个值,我们可以按照这个结果来排序,例如计算每个汽车品牌的销售额,再按照销售额排序:

下面是聚合结果,可见已按照每个品牌的销售额大小做了降序的排序:

和sum、max这些只有一个结果的metrics不同,extended_stats的结果包含了数量、最大值、最小值、平均值、累加和等多种处理,此时必须要指定用其中的哪一项(否则会返回错误:Invalid aggregation order path [xxxx] When ordering on a multi-value metrics aggregation a metric name must be specified):

返回结果如下,可见已经按照metrics结果的avg子项做了升序排序:

在聚合查询中,经常对聚合的数据再次做聚合处理,例如统计每个汽车品牌下的每种颜色汽车的销售额,这时候DSL中就有了多层aggs对象的嵌套,这就是嵌套桶(此名称来自 《Elasticsearch 权威指南》 ),如下图所示:

嵌套桶的排序情况略为复杂,详情请参考 《Elasticsearch聚合的嵌套桶如何排序》 ;

至此,聚合返回结果排序的实战已经完成了,后面的章节会深入学习es的聚合有关的关键知识点;

ES是国际标准化组织发布的浏览器脚本语言的标准,全名:ECMAScript。

ES是JS语言的国际标准,JS是ES的实现。在日常场合,两个词可以互换。

ES是JS的子集,它是JS的内容的一部分,一个完整的JS实现是由以下三部分组成:

核心(ESMAScript) :规定了JS的语法、类型、语句、关键字、保留字、 *** 作符、对象

文档对象模型(DOM) :是用于HTML的应用接口(API),将整个页面映射为一个多层节点结构。

浏览器对象模型(BOM) :与DOM不同,无标准,只是JS一部分,用来对浏览器进行访问和 *** 作。

通过DOM创建的文档结构树形图,开发人员获得了控制页面内容和结构的主动权。借助DOM提供的API,开发人员可以方便的删除、添加、替换、修改任何节点。

使用BOM,开发者可以移动窗口,改变状态栏中的文本,以及执行其他与页面不直接相关的动作。主要处理浏览器窗口和框架。通常情况下BOM包括:

1、d出一些新的浏览器窗口

2、移动、关闭浏览器窗口以及调整窗口大小

3、提供Web浏览器详细信息的定位对象

4、提供用户屏幕分辨率详细信息的屏幕对象

5、对cookie的支持

由于没有相关BOM的标准,每种浏览器都有自己的BOM实现。每种浏览器都可以为这些对象或其他对象定义自己的属性和方法。

ES6是一个历史名词,泛指ES51以后的JavaScript的下一代标准。

涵盖了ES2015、ES2016、ES2017等(ECMA从15年开始,每年6月更新一次标准,标准命名从此用年份标注)。

但由于人们对ES6叫法的习惯,目前使用这个叫法比较多。

如果你被上述问题困扰过,可以参考以下方案

这里需要介绍三种字段的type,分别是 object 、 nested 、 join

现在有个问题,下面的数据如何存入到es中呢,它对应的mapping应该是什么样的呢

name、url这些字段好处理,直接设定字段 "type" : "text" 或者 "type" : "keword" 或者

就行了,但是对于address和links,这种里面包含json对象,或者数组的,怎么处理呢。这里可以采用 "type" : "object" 来处理。如下

可能会对links有疑问,它明明是数组,却怎么和address的设置类似。其实es中是没有单独的数组这一类型,因为他所有的字段都支持数组,比如你是text,你可以放多个值进去,以name为例,你可以放 "name":["张三", "李四"] 这样的数据进去。

而且,es默认对这种嵌套结构建立的索引就是object类型, "type": "object" 可以省略

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10148107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存