接上一篇Kibana基本操作,传送门:ElasticSearch 2. Kibana基本操作
本票学习ES rest API 高级查询语法
基于7.2版本,之前创建了索引库user,本次重新创建了映射如下:
PUT /user/_mapping
{
"properties": {
"username": {
"type": "text"
},
"password": {
"type": "keyword",
"index": false
},
"age": {
"type": "integer"
}
}
}
正文:
查询文档
1. 基本查询
POST /索引库名/_search
{
"query": {
"查询类型": {
"查询条件": "查询条件值"
}
}
}
这里query对象里面可以有不同的查询类型,基本类型有:
-
match_all 查询所有
POST /user/_search { "query": { "match_all": {} } }
-
term 词条匹配
用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串,类似于mysql的=
POST /user/_search { "query": { "term": { "username": "zw" } } }
-
terms 多词条匹配
类似于mysql的in语句
POST /user/_search { "query": { "terms": { "_id": [1,2] } } }
-
match 匹配查询
类似于mysql的like语句,但并不是**%值%**的模糊查询模式。
当配置了分词器时,会先分词然后按照分词进行查询,多个词条之间是or的关系。
现在没有配置分词器,使用效果就相当于=。
POST /user/_search { "query": { "match": { "username": "加油努力奋斗" } } }
将or关系变为and关系:
POST /user/_search { "query": { "match": { "username": { "query": "加油努力奋斗", "operator": "and" } } } }
-
multi_match 多字段匹配查询
与match效果类似,不同的是它可以在多个字段中查询
POST /user/_search { "query": { "multi_match": { "query": "加油努力奋斗", "fields": [ "username", "password" ] } } }
返回结果解释:(来自百度)
贴一个返回结果:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"password" : "1234567",
"username" : "lss"
}
}
]
}
}
- took:查询花费时间,单位是毫秒
- time_out:是否超时
- _shards:分片信息
- hits:搜索结果总览对象
- total:搜索到的总条数
- max_score:所有结果中文档得分的最高分
- hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
- _index:索引库
- _type:文档类型
- _id:文档id
- _score:文档得分
- _source:文档的源数据
2. 查询结果集过滤
es查询默认查询出所有的字段放在_source中,例如:
{
"_index" : "user",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.9808292,
"_source" : {
"username" : "zw",
"password" : "1234567"
}
}
可以通过使用_source属性来指定查询部分字段
-
查询时使用_source属性指定查询字段
POST /user/_search { "_source": "username", "query": { "term": { "username": "zw" } } }
相当于:select username from user where username = ‘zw’
返回:
{ "_index" : "user", "_type" : "_doc", "_id" : "2", "_score" : 0.9808292, "_source" : { "username" : "zw" } }
-
includes和excludes
-
includes:来指定想要显示的字段
-
excludes:来指定不想要显示的字段
# 查询username、password字段 POST /user/_search { "_source": { "includes": [ "username", "password" ] }, "query": { "match_all": {} } }
# 查询排除password字段 POST /user/_search { "_source": { "excludes": "password" }, "query": { "match_all": {} } }
-
3. 范围查询
使用range属性,支持大于、小于、大于等于、小于等于操作。
关键字:
操作符 | 说明 |
---|---|
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
语法:
POST /索引库名/_search
{
"query": {
"range": {
"FILED字段": {
"gte": 值,
"lte": 值
}
}
}
}
举例查询user年纪age大于1小于3的数据:
POST /user/_search
{
"query": {
"range": {
"age": {
"gte": 1,
"lte": 3
}
}
}
}
4. 模糊查询
使用fuzzy属性
语法:
POST /索引库名/_search
{
"query": {
"fuzzy": {
"FILED字段": "值"
}
}
}
例如:查询名称包含s的user
POST /user/_search
{
"query": {
"fuzzy": {
"username": "s"
}
}
}
fuzzy自动将拼写错误的搜索文本,进行纠正,纠正以后去尝试匹配索引中的数据
它允许用户搜索词条与实际词条出现偏差,但是偏差的编辑距离不得超过2:
使用fuzziness属性设置最大纠正编辑距离
例如:我们新增数据{“username”:“phone”}
查询:
POST /user/_search { "query": { "fuzzy": { "username": "phoen" } } }
设置最大纠错距离:
POST /user/_search { "query": { "fuzzy": { "username": { "value": "phoen", "fuzziness": 2 } } } }
返回:
{ "_index" : "user", "_type" : "_doc", "_id" : "gjHSjXkBMRMNNQHn6wqf", "_score" : 1.7868738, "_source" : { "username" : "phone" } }
5. 组合查询
使用bool关键字,包含must(与)、must_not(非)、should(或)三种关系,可进行组合查询。
语法:
POST /user/_search
{
"query": {
"bool": {
"must": {
"查询类型1":{
"查询条件":"查询条件值"
},
"查询类型n":{
"查询条件":"查询条件值"
}
},
"must_not": {
"查询类型1":{
"查询条件":"查询条件值"
},
"查询类型n":{
"查询条件":"查询条件值"
}
},
"should": {
"查询类型1":{
"查询条件":"查询条件值"
},
"查询类型n":{
"查询条件":"查询条件值"
}
}
}
}
}
怎么理解呢,must(与)、must_not(非)、should(或)中可以写多个查询属性,must中的查询属性都是and关系,以此类推must_not中都是not关系,should中都是or的关系
举例:查询user表中username=zs 或username=ls且age!=7、的数据
POST /user/_search { "query": { "bool": { "should": [ { "term": { "username": "zs" } }, { "term": { "username": "ls" } } ], "must_not": { "term": { "age": 7 } } } } }
排序
通过sort属性设置字段排序,通过order设置排序方式
语法:
POST /索引库名/_search { "query": { "match_all": {} }, "sort": [ { "FIELD字段1": { "order": "desc" }, "FIELD字段2": { "order": "asc" } } ] }
举例:
POST /user/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } }, { "_id" : { "order": "asc" } } ] }
高亮
在使用match查询的同时,加上一个highlight属性:
- pre_tags:前置标签
- post_tags:后置标签
- fields:需要高亮的字段
在配置使用分词器的情况下使用,会作用于匹配到的分词
未配置分词器的情况下使用,作用于整个字段
例子:
POST /user/_search
{
"query": {
"match": {
"username": "ls"
}
},
"highlight": {
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields": {
"username": {}
}
}
}
返回:
{
"_index" : "user",
"_type" : "_doc",
"_id" : "gDGjjXkBMRMNNQHnWQpt",
"_score" : 1.7227666,
"_source" : {
"username" : "ls",
"password" : "123456",
"age" : 7
},
"highlight" : {
"username" : [
"<font color='red'>ls</font>"
]
}
},
...
分页查询
使用size,from。语法:
POST /索引库名/_search
{
"query": {
"match_all": {}
},
"size": 2,
"from": 0
}
size:每页数量
from:当前页起始索引, from = (pageNum - 1) * size
后续学习es集群知识和搭建集群以及es java客户端