elasticsearch7.1.1入门之数据查询、聚合

查询

为了方便演示查询,这里我建立一个订单索引,每个订单有诺干个商品,具体的索引结构如下:

{
	"mappings": {
		"properties": {
			"id": {
				"type": "keyword"
			},
			"status":{
				"type":"integer"
			},
			"date": {
				"type": "date",
				"format": "YYYY-MM-dd HH:mm:ss"
			},
			"totalPrice": {
				"type": "double"
			},
			"buyer":{
				"type":"text"
			},
			"products": {
				"properties": {
					"name": {
						"type": "text"
					},
					"price": {
						"type": "double"
					},
					"count": {
						"type": "integer"
					},
					"category": {
						"type": "text"
					}
				}
			}
			
		}
	}
}

单个插入

{
	"buyer": "hx",
	"status": 0,
	"date": "2019-06-07 13:56:00",
	"totalPrice": 23.0,
	"products": [{
		"price": 23.0,
		"count": 1,
		"name": "大水壶",
		"category": "生活用品"
	}]


}

批量插入的例子

{"create":{"_id":"1"}}
{"buyer":"xl","status":1,"date":"2019-06-06 11:14:00","totalPrice":"100","products":[{"price":"20.0","count":"3","name":"鸡肉","category":"肉类"},{"price":"20.0","count":"2","name":"猪肉","category":"肉类"}]}
{"create":{"_id":"2"}}
{"buyer":"jl","status":1,"date":"2019-03-07 11:14:00","totalPrice":"100","products":[{"price":"20.0","count":"2","name":"蜂蜜柚子茶","category":"饮料"},{"price":"40","count":"1","name":"炸鸡","category":"肉类"}]}
{"create":{"_id":"3"}}
{"buyer":"lele","status":1,"date":"2019-05-07 11:14:00","totalPrice":"20","products":[{"price":"20.0","count":"1","name":"波霸奶茶","category":"饮料"}]}
{"create":{"_id":"4"}}
{"buyer":"xl","status":-1,"date":"2019-01-07 11:14:00","totalPrice":"25.5","products":[{"price":"5.5","count":"1","name":"铅笔","category":"文具"},{"price":"20","count":"1","name":"鸡排","category":"肉类"}]}
{"create":{"_id":"5"}}
{"buyer":"lele","status":1,"date":"2019-04-07 11:14:00","totalPrice":"1888","products":[{"price":"1888","count":"1","name":"人头马","category":"酒水类"}]}
{"create":{"_id":"6"}}
{"buyer":"xl","status":0,"date":"2019-05-20 11:14:00","totalPrice":"1314","products":[{"price":"1314","count":"1","name":"超贵的巧克力","category":"甜品"}]}
{"create":{"_id":"7"}}
{"buyer":"lele","status":1,"date":"2019-05-20 11:14:00","totalPrice":"3200","products":[{"price":"1600","count":"1","name":"手机1","category":"电子产品"},{"price":"1200","count":"1","name":"ipad1","category":"电子产品"},{"price":"400","count":"1","name":"es学习视频","category":"电子产品"}]}
{"create":{"_id":"8"}}
{"buyer":"hx","status":1,"date":"2019-05-13 11:14:00","totalPrice":"40","products":[{"price":"20.0","count":"1","name":"牛肉","category":"肉类"},{"price":"20","count":"1","name":"猪肉","category":"肉类"}]}
{"create":{"_id":"9"}}
{"buyer":"jl","status":1,"date":"2019-04-17 11:14:00","totalPrice":"100","products":[{"price":"20.0","count":"1","name":"鸡蛋一盒","category":"肉类"},{"price":"20","count":"4","name":"纸巾","category":"生活用品"}]}
{"create":{"_id":"10"}}
{"buyer":"lele","status":1,"date":"2019-02-06 11:14:00","totalPrice":"60","products":[{"price":"60.0","count":"1","name":"母鸡","category":"肉类"}]}
{"create":{"_id":"11"}}
{"buyer":"zp","status":1,"date":"2019-06-07 13:41:00","totalPrice":"100","products":[{"price":"80.0","count":"1","name":"牛排","category":"肉类"},{"price":"20","count":"1","name":"纸巾","category":"生活用品"}]}
{"create":{"_id":"12"}}
{"buyer":"xl","status":1,"date":"2019-04-17 11:14:00","totalPrice":"100","products":[{"price":"20.0","count":"1","name":"猪肉","category":"肉类"},{"price":"20","count":"4","name":"洗衣液","category":"生活用品"}]}

这里的格式必须是操作一行,具体数据一行,而且注意符号是不可以用中文的,还有结束后要换行

此时查看结果

那接下就可以演示查询的例子了,查询分为get api(普通查询)和search api(复杂查询)

先看get api的例子

get请求

1.localhost:9200/order/_doc/1

2.localhost:9200/order/_doc/1/_source

3.localhost:9200/order/_doc/1/_source?_source_includes=date,totalPrice,status

第一个会返回查询状态和结果,第二个就返回结果,第三个就是筛选某些字段值得查询,官网还有mget api的查询例子

然后到search api

以query参数为载体,然后里面具体有term,terms,range,exists,prefix,match,matchall等等很多类型的查询,具体的查询语法请参阅文档,这里只给出一些例子:

match_all:

{
"query":{
"match_all":{"boost":1.2}

},
"from":1,
"size":2

}

from和size是说从哪里开始,及其返回的条数,boost这个是匹配分数,可以不用管,match_all主要是没有条件的查询

match:

不支持多个字段查询,下面我们搜索下名字为lele xl的订单信息,这时候会返回lele和xl的订单号,并且先按价格再到日期的排序

{
"query":{
"match":{
"buyer":"lele xl"
}},
"sort":[
	{
	"totalPrice":{"order":"desc"}
},
	{
		"date":{"order":"desc"}

}
	]

}

match_phrase

如果仍按照上面的条件查询,是没有结果的,这个会以整个短语去匹配

{
"query":{
"match_phrase":{
"buyer":"lele"
}}

}
match_phrase_prefix:

会以某个词语开头去做相应匹配

multi_match:

这个就是指定要匹配的属性组去匹配一个查询的条件,里面的属性和设置有点多,具体看文档

common,提高查询时对某些词语的匹配度

query_string

这个是针对字符的查询,下面这个例子指定了查询的项,出现了生活用品和lele都会返回

{
"query":{
"query_string":{
	"fields":["products.category","buyer"],
	"query":"生活用品 OR lele"
}
}}

simple_query_string 和字符查询差不多,但不会抛出异常

intervals,可以细化查询,这里有个过滤可用的字段,具体查看文档

 

根据具体项(字段)查询 term

{
"query":{
"term":{
	"status":1
}
}}

terms搜索多值

{
"query":{
"terms":{
	"status":[1,0]
}
}}

范围查询:

range

比如查询总价大于等于20小于等于100

{
"query":{
"range":{
	"totalPrice":{
		"gte":20,
		"lte":1000
		
	}
}
}}

关于term相关的更多查询还是要看官方文档

compound queries复合查询

bool query

类型有:

接下来看个例子

{
	"query": {
		"bool": {
			"should": [{
				"match": {
					"products.category": "饮料"
				}
			}, {
				"term": {
					"buyer": "xl"
				}
			}],
			"must": [{
				"range": {
					"status": {
						"gt": 0
					}
				}
			}],
			"filter": {
				"range": {
					"date": {
						"gt": "2019-03-13 11:14:00"
					}
				}
			}
		}
	}
}

should里面的条件关系or,must里面的条件关系是and,filter里面可以用range,term,match等等的关键词进行过滤,用法和query差不多,然后should里面的意思是,买家姓名为xl或者买了饮料的订单都可以展示,然后must的条件是状态必须大于0(这里也可以用must_not然后range)filter则保留了大于上述时间的结果集

由于查询太多了,所以就写到这里,剩下的有需要用到再去看

聚合

聚合分析主要分为以下四类

Bucket,分桶类型,类似于group by,按照一定的规则将文档分配到不同的桶中,以达到分类分析的目的

Terms根据term分桶,如果是text类型,则按照分词后的结果分桶

range(指定数值范围来设置分桶)

data range(指定日期的范围)

histogram(以固定间隔的策略分割)

date histogram(针对日期)

Metric,指标分析类型,如最大值、最小值、平均值等等

单值分析 min、max、avg、sum、cardinality(distinct count)

多值分析 stats,extended stats percentile(百分位数) percentile rank top hits

Pipeline,管道分析类型,基于上一级的聚合分析结果

Parent结果内嵌到现有的聚合分析结果

Sibling结果与现有聚合分析结果同级

Matrix,矩阵分析类型

语法

aggs->聚合名字->聚合类型->聚合内容

下面看一下聚合,聚合这里要注意一个点,如果对text类型的字段进行聚合时,要先把该字段设为fielddata:true,具体请看

接下来的例子就不以text类型做例子了

求某个属性的平均值,如总价平均值,把下面的avg换成max,min,sum分别求出最大、最小、总和

{
"aggs":{
	"avg_totalPrice":{
		"avg":{"field":"totalPrice"}
	}
}
	
}

基数聚合,其实和sql里面distinct没多大差别

{

"aggs":{
	"productName_count":{
		"cardinality":{
			"field":"products.price"
		}
	}
	
}
	
}

这个就是返回有多少种价格

stats

{

"aggs":{
	"productName_count":{
		"stats":{
			"field":"totalPrice"
		}
	}
	
}
	
}

返回结果

具体更多用法请参阅文档

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值