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分而不能免费,分数少的用户不建议下载)