目录
一、简介
前面一篇文章我们已经介绍了关于Elasticsearch提供的Restful接口API,并通过详细的示例说明了简单的创建索引、插入文档数据、修改文档、删除文档等操作,本篇文章主要总结es查询相关的一些API。
二、ES查询API及其使用方法
- (一)、 简单查询
【a】首先往es中创建索引user,类型info,并插入了三条数据,相关命令如下:
PUT /user/info/1
{
"name": "张三",
"age": 20,
"desc": "美人",
"tag": ["交友","旅游","渣男"]
}
PUT /user/info/2
{
"name": "李四",
"age": 30,
"desc": "丑人",
"tag": ["读书","旅游","暖男"]
}
PUT /user/info/3
{
"name": "王五",
"age": 40,
"desc": "美人",
"tag": ["打篮球","跑步"]
}
插入完成后,在es-head插件中查看索引数据,可以看到数据成功被插入。
最简单的搜索命令如下:
GET /user/info/1
上述命令用于获取一条数据,如下图所示:
下面来看一个带简单条件的查询: 查询姓名name为"张三"的数据。
GET /user/info/_search?q=name:张三
查询结果如下图所示:
- (二)、复杂查询
【a】查询所有数据
在es中,通过match_all来查询出所有数据出来,我们来看一个示例:
查询user索引里面的所有数据,相关命令如下:
GET /user/info/_search
{
"query": {
"match_all": {}
}
}
- query:定义个查询;
- match_all:运行简单类型查询指定索引中的所有文档;
如果只想返回前n条件数据,那么使用size指定即可,如只想返回两条数据回来,可以通过下面的命令实现:
GET /user/info/_search
{
"query": {
"match_all": {}
},
"size": 2
}
如果不指定size,默认是返回10条文档信息。
【b】查询姓名name中带有"张三"的数据
GET /user/info/_search
{
"query": {
"match": {
"name": "张三"
}
}
}
查询结果如下图:
【c】查询姓名匹配"张三"并且年龄是20岁的数据
在es中,通过关键字must来表示"且"的关系,相当于我们关系型数据库中的"and"。
select * from xxx where name = '张三' and age = 20
我们通过构建一个bool(布尔值)查询来实现如上查询。
布尔查询可以接受一个must参数(等价于AND),一个must_not参数(等价于NOT),以及一个should参数(等价于OR)。
相关命令如下:
GET /user/info/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"age": "20"
}
}
]
}
}
}
must其实就相当于sql里面的and查询,所有条件都必须满足,满足条件才返回结果。
当然es肯定还有类似数据库or查询,那就是should,我们来看一个should的例子。
【d】查询姓名匹配"李四"或者年龄是40岁的数据
前面我们使用must实现了且查询,这里我们使用should实现或查询。
select * from xxx where name = '李四' or age = 40
GET /user/info/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "李四"
}
},
{
"match": {
"age": "40"
}
}
]
}
}
}
查询结果如下:
可以看到,成功查询出两条数据,should其实就是多个条件满足其一即可返回数据。
【e】查询年龄不是20岁的数据
select * from xxx where age != 20
GET /user/info/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": "20"
}
}
]
}
}
}
查询结果如下:
【f】查询姓名匹配"张三"并且年龄大于20岁的信息
select * from xxx where name = '张三' and age > 20
GET /user/info/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
}
],
"filter": {
"range": {
"age": {
"gt": 10
}
}
}
}
}
}
在es中,范围查询使用的是filter过滤结合range范围查询,并且有四种关系运算符,如下所示:
- gt:大于
- gte:大于等于
- lt:小于
- lte:小于等于
【g】查询标签包含"男"或者"交友"的数据
select * from xxx where tags like "%男%" or tags like "%交友%"
GET /user/info/_search
{
"query": {
"match": {
"tag": "男 交友"
}
}
}
注意:同一个字段的多个值查询条件使用空格隔开即可。
【h】精确查询
- term:代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。
- match :会使用分词器进行解析,即先分析文档,然后根据解析出来的文档进行查询。
查询姓名中带有"张"的数据:
GET /user/info/_search
{
"query": {
"term": {
"name": "张"
}
}
}
【i】结果过滤
何为结果的过滤,即只返回特定的字段回来,不返回所有字段。在es中,通过_source指定需要返回的字段。
select name,age from xxx
GET /user/info/_search
{
"query": {
"match": {
"name": "张三"
}
},
"_source": [
"name",
"age"
]
}
【j】结果排序
对查询出来的结果进行排序,在es中,通过sort指定字段的排序方式是升序asc还是降序desc。
select * from xxx order by age desc
GET /user/info/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
【k】分页查询
select * from xxx limit 0,10
GET /user/info/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
- from:指定文档索引从哪里开始,默认从0开始;
- size:从from开始,返回多个文档 ;
【l】高亮显示查询
何为高亮?我们打开京东网站,搜索关键字"笔记本电脑":
可以看到,"笔记本电脑"被拆分为很多个词,然后搜索之后,只要匹配到就会高亮显示出来。在es中,使用highlight实现高亮显示,下面看一个示例:
搜索名字匹配"张三",并且name字段高亮显示。
GET /user/info/_search
{
"query": {
"match": {
"name": "张三"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
搜索相关的结果可以高亮显示,可以看到,默认拼接的标签是<em>xxx</em>,当然es也允许我们自己指定自定义标签,自定义样式style、样式class等等。
GET /user/info/_search
{
"query": {
"match": {
"name": "张三"
}
},
"highlight": {
"fields": {
"name": {}
},
"pre_tags": "<b>",
"post_tags": "</b>"
}
}
【m】查询姓名/标签/描述中带有关键字"华"的数据,并按照年龄倒序排序
首先插入几条测试数据:
PUT /user/info/4
{
"name": "刘德华",
"age": 50,
"desc": "刘德华",
"tag": [
"刘德华"
]
}
PUT /user/info/5
{
"name": "吕德华",
"age": 80,
"desc": "吕德华",
"tag": [
"吕德华"
]
}
GET /user/info/_search
{
"query": {
"bool": {
"must": {
"multi_match": {
"query": "华",
"fields": [
"name",
"desc",
"tag"
],
"type": "phrase"
}
}
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
注意,multi_match查询是种分词查询,带有关键字"华" 是指分词后带有"华",所有"i live 华"可以匹配到,但是"ilove华"是匹配不到的。
三、总结
本篇文章主要总结了关于es中查询相关的一些API,并且结合示例讲解,当然es还提供了很多查询命令,感兴趣的小伙伴可以到官网学习查看。由于笔者水平有限,如文中有不对之处,还望指正,相互学习,一起进步!