ES基本操作

1 查询

默认插叙,它会查询索引中的所有文档,并且默认返回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来进行查询,它们三者的区别在于

matchmatch_phraseterm
对查询关键字进行分词处理对查询关键字进行分词处理不对查询关键字进行分词处理
文档指定字段有分词后的任何查询关键字,那么就算文档匹配成功1 文档指定字段有分词有的所有关键字
2 相对位置和查询关键字的相对位置保持一致
由于不分词,因此只要文档中有这个词,即匹配

filter查询
filter和query虽然都是查询,但是他们的侧重点不同下面进行比较

queryfilter
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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值