curl -X GET _source": false'
{
_index_type_id31.0 : {
productNameHonor Note10categoryHonor2499
}
}
curl -X GET localhost:9200/product/_search?prettyproduct*match_all : {}
}
}
'
curl -X GET abc*],1)">1.2.5.? 高亮
curl -X GET matchMI }
},1)">highlightfields: {}
}
}
}
'
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-highlighting.html
1.2.6.? Explain
执行计划可以看到分数是怎样计算出来的
1.3.? Count
curl -X GET localhost:9200/product/_doc/_count?pretty&q=category:honor
curl -X GET localhost:9200/product/_doc/_count?prettyhonor
{
count3_shards : {
total5successfulskippedfailed
}
}
2.? Aggregations
相当于关系型数据库中的聚集函数(或者叫聚合函数)
聚合可以嵌套!聚合可以嵌套!!聚合可以嵌套!!!
聚合主要有4种类型:
- Bucketing
- Mertric
- Matrix
- Pipeline
基本的聚合结构是这样的:
aggregations 是一个JSON对象,它代表一个聚合。(PS:这个关键字也可以用 aggs )
- 每个聚合都关联了一个逻辑名称(例如:如果聚合计算平均价格,那么在这个场景下我可以给这个聚合起个名字叫“avg_price”)
- 在响应结果中,这些逻辑名称用于唯一标识一个聚合
- 每个聚合都有一个指定的类型(比如:sum ,avg ,max ,min 等等)
- 每个聚合类型都定义了自己的body
2.1.??Metrics Aggregations
这种类型的聚合是基于以某种方式从聚合的文档中提取的值来计算度量。这个值通常取自文档的字段值,也可以通过脚本计算得到的。
数值度量聚合是一种特殊的度量聚合,它输出数值。根据输出值的多少,分为单值数值度量聚合(比如:avg)和多值数值度量聚合(比如:stats)。
2.1.1.? Avg
从文档的数值字段中提取值进行计算
假设,我们的文档是学生成绩(0~100),我们可以求平均分数:
curl -X POST localhost:9200/exams/_search?size=0aggs:{
avg_grade:{
:{
field":grade
}
}
}
}
'
上面的聚合例子,计算所有学生的平均成绩。这里的聚合类型是avg,field指定哪个字段用于计算。
再来一个例子:
请求:
curl -X POST localhost:9200/product/_search?size=0avg_price
响应:
{
took13timed_out":
},1)">hits7max_score:[
]
},1)">aggregationsvalue2341.5714285714284
}
}
}
默认情况下,没有那个字段的文档将被忽略(PS:就像关系型数据库中求平均值时会忽略NULL的记录一样),我们可以给它指定一个值,例如:
curl -X POST grade_avg
}
}
}
}
'
如果文档没有grade字段,那么用10作为该字段值参与计算
2.1.2.? Sum
从文档的数值字段中提取值进行计算
constant_score:{
vivo
}
}
}
},1)">vivo_pricessum23796
}
}
}
求category字段值匹配vivo的商品的价格总和
相当于,select sum(price) from product where category like '%vivo%' group by category
2.1.3.? Max
从文档的数值字段中提取值进行计算
curl -X POST localhost:9200/sales/_search?size=0max_price : {
max : {
}
}
}
}
2.1.4.? Stats
这是一个多值聚合,它返回 min ,max ,sum ,count ,avg 的组合结果
curl -X POST grades_statsstats'
它的返回可能是这样的:
{
...
min50.0100.075.0150.0
}
}
}
再来一个例子:
product_stats998429916391
}
}
}
2.2.? Bucket Aggregations
可以理解为范围聚合,它的结果是一段一段的,一个一个的bucket
2.2.1.? Range
每个Range包含from,不包含to
前闭后开区间
curl -X GET price_rangesrangeranges : [
{ to100.0,1)">200.0 }
]
}
}
}
}
'
返回可能是这样的:
{
...
buckets: [
{
key*-100.0doc_count100.0-200.0200.0-*
}
]
}
}
}
再比如:
请求:
curl -X GET 10001000,1)">20001:[
{
5MI 82Honor Magic24MI Max210996vivo X2327981Honor 1021997vivo Z1
}
}
]
},1)">:[
{
*-1000.01000.0-2000.02000.0-*
}
]
}
}
}
代替返回一个数组,可以设置keyed为true,这样可以给每个bucket关联一个位于的字符串key,例如:
curl -X GET keyed" : 100100,1)">200'
于是返回变成这样了:
当然,我们也可以给每个范围区间自定义key:
curl -X GET cheapaverageexpensive'
返回:
举个栗子:
}
},1)">lowmediumhigh0.98082920.69314720.2876821
}
}
}
}
}
2.2.2.? Filter
先过滤再聚合
:{
}
}
}
}
}
}
1898
}
}
}
}
2.2.3.? Terms Aggregation
相当于关系型数据库中的分组(group by)
curl -X GET genrestermsgenre }
}
}
}
doc_count_error_upper_boundsum_other_doc_count : [
{
electronic6rockjazz
}
]
}
}
}
再举个例子:
group_by_category16mi
}
]
}
}
}
size 可以用于指定返回多少个term bucket
3.? 示例
排序
curl -X POST
}
}
}
curl -X POST } }
}
null:[
]
},1)">
]
}
]
}
}
分组求平均
},1)"> : {
2999
}
},1)">1799
}
}
]
}
}
}
4.? 示例索引
curl -X PUT localhost:9200/product": {text},1)">fielddata}
}
}
}
}
localhost:9200/product/_doc/_bulk' --data-binary @product.json
{index } }
{}
{998}
5.? 参考
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket.html
6.? 其它相关
《Elasticsearch查询》
?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!