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的博客)或者为这篇文章点赞,谢谢!

1 0
原创粉丝点击