默认插叙,它会查询索引中的所有文档,并且默认返回10个文档给用户
curl -X PUT node:9200/bank/_search?pretty
相当于SQL中的查询表中的所有内容
select * from table;
query查询
查询往往会跟随一定的条件,这个时候,可以使用ES的DSL查询语言
//查询所有文档,并返回10个
curl -X PUT node:9200/bank/_search?pretty -d
'
{
"query":{"match_all":{}}
}
'
//按照单个字段条件进行查询
curl -X PUT node:9200/bank/_search?pretty -d
'
{
"query":{
"match":{"lastname":"Ayala"}
}
}
'
相当于SQL中的where查询,但是like查询效率较低,原因在于like查询不走索引
select * from table where lastname like %Ayala%
//查询结果显示制定字段
curl -X PUT node:9200/bank/_search?pretty -d
'
{
"query":{
"match":{"lastname":"Ayala"}
},
"_source":["lastname","age"]
}
'
//SQL查询,并显示指定字段
select lastname , age from table where lastname like %Ayala%
//参考关系型数据库,有时候查询的时候需要同事满足多个字段的匹配情况
curl -X PUT node:9200/bank/_search?pretty -d
'
{
"query":{
"multi_match":{
"query":"hello", //这事查询关键字
"fields":["lastname","city"]
}
}
}
'
相当于SQL中的多条件查询的特殊情况
select * from table where lastname like %hello% and city like %hello%
//实际上multi_match使用比较不方便,因为它查询的是多个字段对一个关键字的匹配程度
//大多数情况下,我们需要的是多个查询条件,并且这些条件还需要组合
//这个时候,我们可以使用must should mast_not关键字来进行查询,它们分别对用与与、或、非操作
//使用这些关键字进行查询的时候,需要使用bool关键字进行组合,即使只有一种类型的查询,也需要bool关键字组合,否则报错
curl -X PUT node:9200/bank/_search?pretty -d
'
{
"query":{
"bool":{
"must":[
{
"match":{
"lastname":"hello"
}
},
... //可以多个条件
],
"should":[...]
}
}
}
'
相当于SQL查询是:
select * from table where (lastname like %hello% and ...) or (... or ...)
使用query查询的时候,可以使用match作为文档匹配的关键字,但是有时候需要进行精确查询,这个时候可以使用match_phrase或者term来进行查询,它们三者的区别在于
match | match_phrase | term |
---|---|---|
对查询关键字进行分词处理 | 对查询关键字进行分词处理 | 不对查询关键字进行分词处理 |
文档指定字段有分词后的任何查询关键字,那么就算文档匹配成功 | 1 文档指定字段有分词有的所有关键字 2 相对位置和查询关键字的相对位置保持一致 |
由于不分词,因此只要文档中有这个词,即匹配 |
filter查询
filter和query虽然都是查询,但是他们的侧重点不同下面进行比较
query | filter |
---|---|
query强调的是文档与关键字的匹配程度 | filter强调的是文档是否满足查询条件 |
query根据搜索关键字对每个文档进行打 | filter仅仅会查询过滤,并不对文档进行打分 |
filter查询es5.x之后又很大的改动,因此形如下面的filter查询会报错,这是因为在es5.x之后,纯粹的filter查询已经被弃用了
{
"query":{
"filtered":{
"query":{
"match":{
"lastname":"Harding"
}
}
},
"filter":{
"range":{
"age":{
"gte":30
}
}
}
}
}
//报错信息
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 3,
"col": 22
}
],
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 3,
"col": 22
},
"status": 400
}
现在可以使用bool查询组合filter查询,方式是:
{
"query":{
"bool":{
"filter":{
"range":{
"age":{"lte":30}
}
}
}
}
}
相当于SQL中的查询:
select * from table where age <= 30
//当然也可以filter和query进行组合查询
{
"query":{
"bool":{
"must":{
"match":{
"lastname":"hello"
}
},
"filter":{
"range":{
"age":{"lte":30}
}
}
}
}
}
filter查询更多是用于过滤掉无用信息,最常用的就是查询某个范围内的数据,可以使用range关键字来进行表示,上面有。表示大于小于的有:
gt:大于,gte:大于等于,lt:小于,lte:小于等于
排序
排序也是比较常用的用法
curl -X PUT node:9200/bank/_search?pretty -d
'
{
"query":{"match_all":{}},
"sort":{
"age":{
"order":"desc" //降序排序,asc是升序排序
}
}
}
'
相当于SQL中的order by
select * from table where ... order by age
聚合查询
再次参考关系型数据库,有时候需要对存储的数据进行查询,完了之后基于查询数据做聚合查询,这就是为什么es是一个数据分析引擎,使用聚合查询所使用的关键字就是aggs
curl -X PUT node:9200/bank/_search?pretty -d
'
{
"aggs":{
"aggstest":{ //聚合名字
"max":{
"field":"age" //查询age最大的文档
}
}
}
}
'
SQL查询相当于
select max() from table
{
"aggs":{
"aggstest":{ //聚合名字,这事桶聚合,桶聚合就是把同一类的放放一组聚合
"terms":{
"field":"gender" //查询age最大的文档
}
}
}
}
SQL中的分组查询
select count(*) from table group by gender