26.Elasticsearch API初步进阶
来源:互联网 发布:安卓手机数据导出 编辑:程序博客网 时间:2024/05/19 16:36
转载*请注明原始出处:http://blog.csdn.net/a464057216/article/details/50967263
定制返回结果的字段
默认情况下,Elasticsearch的查询结果返回每个document的所有字段,比如如下是hits.hits中某个document的信息:
{ "_index" : "bank", "_type" : "account", "_id" : "44", "_score" : 1.0, "_source" : { "account_number" : 44, "balance" : 34487, "firstname" : "Aurelia", "lastname" : "Harding", "age" : 37, "gender" : "M", "address" : "502 Baycliff Terrace", "employer" : "Orbalix", "email" : "aureliaharding@orbalix.com", "city" : "Yardville", "state" : "DE" }}
其中_source中是某个document的所有字段信息。如果只想返回document中的部分字段,可以使用如下请求:
$ curl "localhost:9200/bank/_search?pretty" -d '> {> "query":{"match_all":{}},> "_source":["account_number", "balance"],> "size":2> }'
按照字段查询
与match_all查询不同,match查询可以指定某个字段的查询条件进行查询。
比如查询account_number为20的信息:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query":{"match": {"account_number": 20}},> "_source":["account_number", "balance"]> }'
查询address字段包含字符串mill(忽略大小写)的document:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query": {"match":{"address": "mill"}}> }'
查询address字段中有”mill”(忽略大小写)或者”lane”(忽略大小写)的document:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query": {"match":{"address":"mill lane"}}> }'
查询addresss字段中包含”mill lane”字符串(忽略大小写)的document:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query":{"match_phrase":{"address": "mill lane"}}> }'
bool查询可以组合各种查询以实现复杂的查询,比如:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query":{> "bool":{> "must":[> {"match":{"address": "mill"}},> {"match":{"address": "lane"}}> ]> }> }> }'
bool must语句表示所有的查询条件必须为真。如果要求查询条件中,至少有一个为真,可以使用bool should语句:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query":{> "bool":{> "should":[> {"match":{"address":"mill"}},> {"match":{"address":"lane"}}> ]> }> }> }'
如果要求多个条件均为假,可以使用bool must_not语句:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query":{> "bool":{> "must_not":[> {"match":{"address":"mill"}},> {"match":{"address":"lane"}}> ]> }> }> }'
bool must、bool should、bool must_not三种语句可以混合使用,比如查询年龄为40岁但是不居住在ID的document:
$ curl 'localhost:9200/bank/_search?pretty' -d '{"query":{"bool":{"must":[{"match":{"age":40}},{"bool":{"must_not":[{"match":{"address":"ID"}}] } }] } },"size":100}'
过滤查询
在每个查询结果中,_score可以看作是document与我们的查询条件的匹配程度。
{ "_index" : "bank", "_type" : "account", "_id" : "584", "_score" : 3.8649755, "_source" : { "account_number" : 584, "balance" : 5346, "firstname" : "Pearson", "lastname" : "Bryant", "age" : 40, "gender" : "F", "address" : "971 Heyward Street", "employer" : "Anacho", "email" : "pearsonbryant@anacho.com", "city" : "Bluffview", "state" : "MN" }}
bool query也支持range查询(通常用于数字和日期的过滤),比如查询余额在[20000, 30000]内的document:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "query":{> "bool":{> "must":{"match_all":{}},> "filter":{> "range":{> "balance":{> "gte":20000,> "lte":30000> }> }> }> }> }> }'
聚合
聚合这一特性使得可以在一次请求中,即完成对hits的展示,又完成结果的聚合。
如下请求不显示hits的部分,显示按照state分类后每个state的账户数量情况(默认按照group中元素数量的多少降序显示10个group的信息):
$ curl "localhost:9200/bank/_search?pretty" -d '> {> "size":0,> "aggs":{> "group_by_state":{> "terms":{> "field":"state"> }> }> }> }'
如下请求不显示hits的部分,显示按照state分类后,每个state的账户的余额的平均值(仍然是按照每个group中元素数量的多少降序显示10个group的信息):
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "size":0,> "aggs":{> "group_by_state":{> "terms":{> "field":"state"> },> "aggs":{> "average_balance":{> "avg":{> "field":"balance"> }> }> }> }> }> }'
如果上面的例子我们想要按照每个state的账户余额的平均值排序,需要使用如下语句:
$ curl 'localhost:9200/bank/_search?pretty' -d '> {> "size":0,> "aggs":{> "group_by_state":{> "terms":{> "field":"state",> "order":{> "average_balance":"desc"> }> },> "aggs":{> "average_balance":{> "avg":{> "field":"balance"> }> }> }> }> }> }'
下面这段聚类更为复杂,它先将所有document按照年龄段聚类(20~29、30~39、40~49),然后在每个年龄段内按照性别分类,在每个分类下面显示平均余额:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '{ "size": 0, "aggs": { "group_by_age": { "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 }, { "from": 30, "to": 40 }, { "from": 40, "to": 50 } ] }, "aggs": { "group_by_gender": { "terms": { "field": "gender" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } } }}'
如果觉得我的文章对您有帮助,欢迎关注我(CSDN:Mars Loo的博客)或者为这篇文章点赞,谢谢!
- 26.Elasticsearch API初步进阶
- Elasticsearch 学习 初步总结
- elasticsearch 创建搜索初步
- elasticsearch 初步了解
- 【转载】Elasticsearch初步
- elasticsearch评分进阶
- 【Elasticsearch】1.Elasticsearch与Solr 初步了解
- elasticsearch中初步使用filter
- ElasticSearch初步认识及安装
- Elasticsearch之 java api
- elasticsearch java api优化
- ElasticSearch: Java API
- Elasticsearch Java API总汇
- elasticsearch java api资料
- elasticsearch java API ------搜索
- elasticsearch java api demo
- ElasticSearch的Java API
- Elasticsearch Java API
- 【MySQL】 SELECT语句 检索 排序 过滤 通配符搜索 正则表达式搜索
- 输出星号图2
- 第二周练习 百鸡百钱问题
- GRASP 职责分配原则[转]
- java动态代理(JDK和cglib)
- 26.Elasticsearch API初步进阶
- 什么是丑数
- 可变函数
- 设计模式 —— 单例
- STM32 I2C上拉电阻的选择问题
- linux下mysql数据库每天定时备份 --谷营中西软件科技园
- 循环
- ubuntu安装nginx
- 机器学习实战之--regression