首页 > 开发 > 综合 > 正文

Elasticsearch5.20 基本语法之查询

2024-07-21 02:52:40
字体:
来源:转载
供稿:网友
Elasticsearch5.20 基本语法之查询这里我们先导入测试数据accounts.json( 下载地址:http://download.csdn.net/detail/taoshujian/9766616 )Elasticsearch导入json数据的语法如下:
curl -XPOST localhost:9200/bank/account/_bulk?PRetty  --data-binary "@E:/programme/_backups/accounts.json"@后面为文件路径,也可是相对路径如果你的windows下没有curl命令,可以看看这里: http://blog.csdn.net/taoshujian/article/details/60147463Elasticsearch查询有两种基本方式:URI和request body下面先看一个查询示例:通过URI方式查询执行如下命令:
#REST request URIGET /bank/_search?q=*&sort=account_number:asc&pretty返回结果如下:这里q=*参数表示匹配所有文档。sort=account_number:asc参数表示按account_number对结果进行升序排序。pretty参数表示格式化JSON结果。至于响应,我们看到以下部分:took - Elasticsearch执行搜索的时间(以毫秒为单位)timed_out - 告诉我们搜索是否超时_shards - 告诉我们搜索了多少分片,以及成功/失败的搜索分片的计数hits - 搜索结果hits.total - 符合我们的搜索条件的文档总数hits.hits - 搜索结果的实际数组(默认为前10个文档)hits.sort - 结果排序键(如果按分数排序,则缺少)同样的查询规则通过request body方式查询时语法如下:
#REST request bodyGET /bank/_search{  "query": { "match_all": {} },  "sort": [    { "account_number": "asc" }  ]}Elasticsearch提供了一种JSON风格的语言,可用于执行查询。这被称为Query DSL。查询语言相当全面,实际学习它还是要从几个基本的例子开始。
#查询所有  GET /bank/_search{  "query": { "match_all": {} }}#查询一条  注: 默认情况下查询的就是所有数据,所以示例中"query": { "match_all": {} }不是必写的GET /bank/_search{  "query": { "match_all": {} },  "size": 1}#查询第11至第20条数据 注:from默认从0开始的GET /bank/_search{  "query": { "match_all": {} },  "from": 10,  "size": 10}#按balance降序GET /bank/_search{  "query": { "match_all": {} },  "sort": { "balance": { "order": "desc" } }}#只查询account_number和balanceGET /bank/_search{  "query": { "match_all": {} },  "_source": ["account_number", "balance"]}可以将match查询视为基本的字段化搜索查询(即针对特定字段或字段集进行的搜索)。
#查询account_number=20的帐户GET /bank/_search{  "query": { "match": { "account_number": 20 } }}#查询在address中包含术语“mill”的所有帐户GET /bank/_search{  "query": { "match": { "address": "mill" } }}#查询在address中包含“mill”或“lane”一词的所有帐户:GET /bank/_search{  "query": { "match": { "address": "mill lane" } }}#此示例是match(match_phrase)的变体,查询在address中包含短语“mill lane”的所有帐户:GET /bank/_search{  "query": { "match_phrase": { "address": "mill lane" } }}bool查询允许我们撰写较小的查询到使用布尔逻辑更大的查询
#此示例编写两个match查询,即查询address中包含“mill”和“lane”的所有帐户。bool must子句表示所有条件必须满足 类似于判断条件中的&&。GET /bank/_search{  "query": {    "bool": {      "must": [        { "match": { "address": "mill" } },        { "match": { "address": "lane" } }      ]    }  }}#相比之下,此示例中两个match则是查询并address中包含“mill”或“lane”的所有帐户。bool should类似于判断条件中的||GET /bank/_search{  "query": {    "bool": {      "should": [        { "match": { "address": "mill" } },        { "match": { "address": "lane" } }      ]    }  }}#此示例的两个match查询,则是查询address中既不包含“mill”也不包含“lane”的所有帐户。GET /bank/_search{  "query": {    "bool": {      "must_not": [        { "match": { "address": "mill" } },        { "match": { "address": "lane" } }      ]    }  }}#我们可以在查询中同时合并must,should和must_not子句bool。此外,我们可以bool在任何这些bool子句中组合查询来模拟任何复杂的多级布尔逻辑。此示例返回任何age=40但state!=ID的所有帐户:GET /bank/_search{  "query": {    "bool": {      "must": [        { "match": { "age": "40" } }      ],      "must_not": [        { "match": { "state": "ID" } }      ]    }  }}关于过滤器filters的查询
#range查询,它允许我们通过一定范围的值来过滤文档。这通常用于数字或日期过滤。#使用bool查询返回余额介于20000和30000(含)之间的所有帐户。换句话说,我们想要找出余额大于或等于20000且小于或等于30000的帐户。GET /bank/_search{  "query": {    "bool": {      "must": { "match_all": {} },      "filter": {        "range": {          "balance": {            "gte": 20000,            "lte": 30000          }        }      }    }  }}#解析上面的查询,bool查询包含一个match_all查询(查询部分)和一个range查询(过滤器部分)。我们可以将任何其他查询替换为查询和过滤器部分。关于分组聚合查询
#这个例子按状态分组所有的帐户,然后返回前10(默认)状态,按照count递减排序(也是默认)GET /bank/_search{  "size": 0,  "aggs": {    "group_by_state": {      "terms": {        "field": "state.keyWord"      }    }  }}#与SQL语法相识:SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC#注:设置size=0为不显示搜索匹配。你可以不写size=0看看返回结果#下面示例计算按州(state)的平均帐户余额(仅针对按降序排序的前10个州)GET /bank/_search{  "size": 0,  "aggs": {    "group_by_state": {      "terms": {        "field": "state.keyword"      },      "aggs": {        "average_balance": {          "avg": {            "field": "balance"          }        }      }    }  }}#注意我们如何在average_balance聚合中嵌套group_by_state聚合。这是所有聚合的常见模式。您可以任意嵌套聚合中的聚合,以提取您需要从数据中获得的透视摘要。基于之前的聚合,现在我们以降序对平均余额进行排序GET /bank/_search{  "size": 0,  "aggs": {    "group_by_state": {      "terms": {        "field": "state.keyword",        "order": {          "average_balance": "desc"        }      },      "aggs": {        "average_balance": {          "avg": {            "field": "balance"          }        }      }    }  }}#这个例子演示了我们如何根据年龄段(20-29,30-39和40-49),然后按性别分组,然后最终得到每个年龄段的每个性别的平均帐户余额:GET /bank/_search{  "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.keyword"          },          "aggs": {            "average_balance": {              "avg": {                "field": "balance"              }            }          }        }      }    }  }}到这里我们会发现ElasticSearch的语法和SQL其实是异曲同工的。它因为功能强大而简单,亦因为功能强大而复杂。事实上我这几篇关于Elasticsearch的笔记都是根据它的官网来的,自己并没增加什么东西,因为官方文档很清晰了,而且我也没有删减什么内容,因为这些都是必要的。看过这些后,基本的增删改查已经没什么问题,算是上手了,那么后续将会看看它的理论基础部份。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表