共计 4932 个字符,预计需要花费 13 分钟才能阅读完成。
ElasticSearch 根本应用姿态二
本文作为 elasticsearch 根本应用姿态第二篇,蕴含以下内容
- 查问指定字段
- 限度返回条数
- 分页查问
- 分组查问
- 高亮
- 主动补全提醒
- 排序
- 返回后果聚合,如统计文档数,某个 field value 的求和、平均值等
更多相干知识点请查看: * ElasticSearch 根本应用姿态 – 一灰灰 Blog
<!– more –>
0. 数据筹备
初始化一个索引,写入一些测试数据
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:08",
"url": "/test",
"execute": {
"args": "id=10&age=20",
"cost": 10,
"res": "test result"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/test",
"execute": {
"args": "id=20&age=20",
"cost": 11,
"res": "test result2"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:10",
"url": "/test",
"execute": {
"args": "id=10&age=20",
"cost": 12,
"res": "test result2"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/hello",
"execute": {
"args": "tip=welcome",
"cost": 2,
"res": "welcome"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/404",
"execute": {
"args": "tip=welcome",
"cost": 2,
"res": "xxxxxxxx"
},
"response_code": 404,
"app": "yhh_demo"
}
1. 查问指定字段
比方我当初只关怀 url 返回的状态码, 次要借助 _source
来指定须要查问的字段,查问的语法和之前介绍的统一
GET second-index/_search
{
"_source": [
"url",
"response_code"
],
"query": {"match_all": {}
}
}
2. 返回条数限度
针对返回后果条数进行限度,属于比拟常见的 case 了,在 es 中,间接通过 size
来指定
GET second-index/_search
{
"query": {"match_all": {}
},
"size": 2
}
3. 分页查问
通过 size 限度返回的文档数,通过 from 来实现分页
GET second-index/_search
{
"query": {"match_all": {}
},
"size": 1,
"from": 1
}
(留神上面输入截图,与下面的比照,这里返回的是第二条数据)
4. 分组查问
相当于 sql 中的group by
,罕用于聚合操作中的统计计数的场景
在 es 中,应用 aggs
来实现,语法如下
"aggs": {
"agg-name": { // 这个 agg-name 是自定义的聚合名称
"terms": { // 这个 terms 示意聚合的策略,依据 field 进行分组
"field": "","size": 10
}
}
}
比方咱们心愿依据 url 统计拜访计数,对应的查问能够是
GET second-index/_search
{
"query": {"match_all": {}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url",
"size": 2
}
}
}
}
然而在执行时,会发现并不能失常响应
左边返回的提示信息为 Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [url] in order to load field data by uninverting the inverted index. Note that this can use significant memory
这个异样
简略来说,就是 url 这个字段为 text 类型,默认状况下这种类型的不走索引,不反对聚合排序,如果须要则须要设置fielddata=true
,或者应用 url 的分词url.keyword
GET second-index/_search
{
"query": {"match_all": {}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url.keyword",
"size": 2
}
}
}
}
留神
- 尽管咱们更重视的是分组后的后果,然而
hits
中仍然会返回命中的文档,若是只想要分组后的统计后果,能够在查问条件中增加size:0
- 聚合操作和查问条件是能够组合的,如只查问某个 url 对应的计数
GET second-index/_search
{
"query": {
"term": {
"url.keyword": {"value": "/test"}
}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url.keyword",
"size": 2
}
}
}
}
下面介绍了 TEXT 类型的 field,依据分词进行聚合操作;还有一种形式就是设置fielddata=true
,操作姿态如下
PUT second-index/_mapping
{
"properties": {
"url": {
"type": "text",
"fielddata": true
}
}
}
批改结束之后,再依据 url 进行分组查问,就不会抛异样了
5. 全文搜寻
- 211018-ElasticSearch 全文搜寻反对配置 – 一灰灰 Blog
通过配置一个动静索引模板,将所有的 field 构建一个用于全文检索的 field,从而实现全文搜寻
6. 聚合操作
下面的分组也算是聚合操作中的一种,接下来认真看一下 es 的聚合,能够反对哪些货色
聚合语法:
"aggs": {
"agg_name": { // 自定义聚合名
"agg_type": { // agg_type 聚合类型,如 min, max
"agg_body" // 要操作的计算值
},
"meta": {},
"aggregations": {} // 子聚合查问}
}
从聚合分类来看,能够划分为上面几种
- Metric Aggregation: 指标剖析聚合
- Bucket Aggregation: 分桶聚合
- Pipeline: 管道剖析类型
- Matrix: 矩阵剖析类型
5.1 Metric Aggregation: 指标剖析聚合
常见的有 min, max, avg, sum, cardinality, value count
通常是值查问一些须要通过计算获取到的值
上面别离给出一些演示阐明
5.1.1 min 最小值
获取申请耗时最小的 case
GET second-index/_search
{
"size": 0,
"aggs": {
"min_cost": {
"min": {"field": "execute.cost"}
}
}
}
- size: 0 示意不须要返回原数据
- min_cost: 自定义的聚合名
- min: 示意聚合类型,为取最小值
"field": "execute.cost"
: 示意取的是Field: execute.cost
的最小值
5.1.2 max 最大值
根本同上,上面中贴出申请代码,截图就省略掉了
GET second-index/_search
{
"size": 0,
"aggs": {
"max_cost": {
"max": {"field": "execute.cost"}
}
}
}
5.1.3 sum 求和
GET second-index/_search
{
"size": 0,
"aggs": {
"sum_cost": {
"sum": {"field": "execute.cost"}
}
}
}
5.1.4 avg 平均值
在监控均匀耗时的统计中,这个还是比拟能体现服务的整体性能的
GET second-index/_search
{
"size": 0,
"aggs": {
"avg_cost": {
"avg": {"field": "execute.cost"}
}
}
}
5.1.5 cardinality 去重统计计数
这个等同于咱们常见的 distinct count
留神与前面的 value count
统计所有有值的文档数量之间的区别
GET second-index/_search
{
"_source": "url",
"aggs": {
"cardinality_cost": {
"cardinality": {"field": "url"}
}
}
}
去重统计 url 的计数,如下图,能够看到返回统计后果为 3,然而理论的文档数有 5 个
5.1.6 value count 计数统计
文档数量统计,区别于下面的去重统计,这里返回的是全量
GET second-index/_search
{
"size": 0,
"aggs": {
"count_cost": {
"value_count": {"field": "url"}
}
}
}
输入后果配合 cardinality 的返回,做一个比照能够增强了解
5.1.7 stats 多值计算
一个 stats 能够返回下面 min,max,sum...
等的计算值
GET second-index/_search
{
"size": 0,
"aggs": {
"mult_cost": {
"stats": {"field": "execute.cost"}
}
}
}
5.1.8 extended_stats 多值扩大
在下面 stats 的根底上进行扩大,反对方差,标准差等返回
GET second-index/_search
{
"size": 0,
"aggs": {
"mult_cost": {
"extended_stats": {"field": "execute.cost"}
}
}
}
5.1.9 percentile 百分位数统计
用于统计 xx% 的记录值,小于等于左边
如上面截图,可知 99% 的记录,耗时小于 12
默认的百分比区间是: [1, 45, 25, 50, 75, 95, 99]
,能够手动批改
GET second-index/_search
{
"size": 0,
"aggs": {
"agg_cost": {
"percentiles": {
"field": "execute.cost",
"percents": [
10,
50,
90,
99
]
}
}
}
}
5.1.10 percentile rank 统计值所在的区间
下面用于统计不同区间的占比,比方公司的人员年龄散布;而这一个则是我想晓得 18 岁的我,在哪个占比里
GET second-index/_search
{
"size": 0,
"aggs": {
"agg_cost": {
"percentile_ranks": {
"field": "execute.cost",
"values": [6, 9]
}
}
}
}
相干博文
ElasticSearch:aggregations 聚合详解
Elasticsearch 聚合剖析深刻学习
Elasticsearch: 权威指南 - 聚合
一灰灰的联系方式
尽信书则不如无书,以上内容,纯属一家之言,因集体能力无限,不免有疏漏和谬误之处,如发现 bug 或者有更好的倡议,欢送批评指正,不吝感谢
- 集体站点:https://blog.hhui.top
- 微博地址: 小灰灰 Blog
- QQ:一灰灰 /3302797840
- 微信公众号:一灰灰 blog