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"}
}
}
}
从返回结果看,
以下是返回结果:
{
...
"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分而不能免费,分数少的用户不建议下载)