ElasticSearch学习笔记(一)——查询与聚合

    ElasticSearch是一个搜索引擎,也可以当做数据库使用。它里面的index相当于关系数据库中的database,它里面的type相当于关系数据库中的table。本文创建一个测试索引te和一个测试类型user,先准备好我们要插入的数据,存放在user.json文件里,user.json文件内容如下:

{"index":{"_id":"1"}}
{"username":"aoa","money":1000,"age":32,"city":"nanjing"}
{"index":{"_id":"2"}}
{"username":"bob","money":2000,"age":15,"city":"nanjing"}
{"index":{"_id":"3"}}
{"username":"coc","money":3000,"age":15,"city":"beijing"}
{"index":{"_id":"4"}}
{"username":"dod","money":4000,"age":15,"city":"beijing"}
{"index":{"_id":"5"}}
{"username":"eoe","money":5000,"age":15,"city":"shanghai"}
{"index":{"_id":"6"}}
{"username":"fof","money":6000,"age":15,"city":"shanghai"}

    注意,上面是12行,复制到user.json文件里时user.json文件尾部一定要多一行空行,不然第6条数据(文档)不能插入。

    然后在user.json所在文件夹下打开终端,输入命令

curl -XPOST "127.0.0.1:9200/te/user/_bulk?pretty" --data-binary @user.json

    上面命令会创建一个名叫te的索引和一个名叫user的类型,并插入6条测试数据。在浏览器打开http://127.0.0.1:9200/_mapping可以查看索引、类型的结构。

    接下来就可以查询了,先做一个简单的布尔查询吧,可以在head插件里输入并查询。

    1.查询city不是nanjing的,且年龄是32或者15的user,且只显示username和city字段

POST http://127.0.0.1:9200/te/user/_search
{
	"_source":["username","city"],
	"query":{
		"bool":{
			"must":[
				{
					"terms":{
						"age":[32,15]
					}
				}
			],
			"must_not":{
				"term":{
					"city":"nanjing"
				}
			}
		}
	}
}

   再做一个度量聚合-最小值聚合

    2.查询年龄是15且money最少的user的money数

POST http://127.0.0.1:9200/te/user/_search
{
	"query":{
		"term":{
			"age":15
		}
	},
	"aggs":{
		"my_agg_name":{
			"min":{
				"field":"money"
			}
		}
	}
}
    注意,返回结果在"aggregations"里,不在"hits"里,"hits"里返回的结果对应"query"里的条件。

    以下是返回结果:

{
	...
	"aggregations":{
		"my_agg_name":{
			"value":2000
		}
	}
}

    再做一个 度量聚合-平均值聚合

    3.查询所有user的money的平均值

POST http://127.0.0.1:9200/te/user/_search
{
	"aggs":{
		"my_agg_name":{
			"avg":{
				"field":"money"
			}
		}
	}
}
    注意,返回结果在"aggregations"里,不在"hits"里。因为没有"query","hits"里返回所有的user。

    以下是返回结果:

{
	...
	"aggregations":{
		"my_agg_name":{
			"value":3500
		}
	}
}

    再做一个 分组(桶)聚合-范围聚合

    4.查询money范围为(-无穷,1000)、[1000, 3000)、[3000, +无穷)这3个区间的user数

POST http://127.0.0.1:9200/te/user/_search
{
	"aggs":{
		"my_agg_name":{
			"range":{
				"field":"money",
				"ranges":[
					{"to":1000},
					{"from":1000,"to":3000},
					{"from":3000}
				]
			}
		}
	}
}

    以下是返回结果:

{
	...
	"aggregations":{
		"my_agg_name":{
			"buckets":[
				{
					"key":"*-1000.0",
					"to":1000,
					"to_as_string":"1000.0",
					"doc_count":0
				},
				{
					"key":"1000.0-3000.0",
					"from":1000,
					"from_as_string":"1000.0",
					"to":3000,
					"to_as_string":"3000.0",
					"doc_count":2
				},
				{
					"key":"3000.0-*",
					"from":3000,
					"from_as_string":"3000.0",
					"doc_count":4
				}
			]
		}
	}
}

    再做一个 管道聚合-平均分组聚合

    5.查询money范围为(-无穷,1000)、[1000, 3000)、[3000, +无穷)这3个区间各自的user的money的总和

POST http://127.0.0.1:9200/te/user/_search
{
	"aggs":{
		"my_agg_name":{
			"range":{
				"field":"money",
				"ranges":[
					{"to":1000},
					{"from":1000,"to":3000},
					{"from":3000}
				]
			},
			"aggs":{
				"my_agg_name_child":{
					"sum":{"field":"money"}
				}
			}
		},
		"my_agg_name_2":{
			"avg_bucket":{"buckets_path":"my_agg_name>my_agg_name_child"}
		}
	}
}
从返回结果看,
my_agg_name是桶聚合("my_agg_name"下有"buckets"),
my_agg_name_2是度量聚合("my_agg_name_2"下有"value")。

以下是返回结果:

{
	...
	"aggregations":{
		"my_agg_name":{
			"buckets":[
				{
					"key":"*-1000.0",
					"to":1000,
					"to_as_string":"1000.0",
					"doc_count":0,
					"my_agg_name_child":{
						"value":0
					}
				},
				{
					"key":"1000.0-3000.0",
					"from":1000,
					"from_as_string":"1000.0",
					"to":3000,
					"to_as_string":"3000.0",
					"doc_count":2,
					"my_agg_name_child":{
						"value":3000
					}
				},
				{
					"key":"3000.0-*",
					"from":3000,
					"from_as_string":"3000.0",
					"doc_count":4,
					"my_agg_name_child":{
						"value":18000
					}
				}
			]
		},
		"my_agg_name_2":{
			"value":10500
		}
	}
}

总结:本文用了一个类型user讲了5个示例,但是没有涉及到类型的嵌套,但也算是入门比较好的例子了。源代码请到https://download.csdn.net/download/qq_27311165/10470133下载。(这个压缩文件里面的文字和本文的笔记差不多。但是设定资源最低只能1分而不能免费,分数少的用户不建议下载)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值