ES复杂查询
先了解搜索后的结构体!
注意 在kibana中每个key 在后面结合springboot后都是对应的对象!
筛选字段 source
"_source": ["field","field",...]
如果设置source就像mysql中指定字段名一样!
排序 sort
"sort": [
{
"age": { #这是个集合,代表可以有多个值进行排序
"order": "desc" #asc或desc
}
}
]
分页 form,size
"from": 0, #从第几个数据开始
"size": 1 #显示多少条
多条件匹配查询 must 相当于mysql中的关键词and
使用must可以将条件进行and匹配
GET /my_index6/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张"
}
},
{
"match": {
"age": 23
}
}
]
}
}
}
可以把match换成term 单词进行精确匹配
多条件匹配 should 相当于 mysql中的关键词or
使用should 可以将条件进行or匹配
GET /my_index6/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "张二狗"
}
},
{
"match": {
"age": 23
}
}
]
}
}
}
多条件查询 must_not 不等于 则匹配
多条件 and关系
GET /my_index6/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": 23
}
}
]
}
},
"_source": ["age"]
}
复杂查询 fitle 过滤
- gt #大于 >
- gte #大于等于 >=
- lt #小于 <
- lte #小于等于 <=
查询年龄在22到24之间的数据
"filter": [
{
"range": {
"age": {
"gte": 22,
"lte": 24
}
}
}
]
复杂查询 一个字段多条件匹配 or
只需要空格隔开就行
text和keyword、match和term区别
- text 会被分词器解析
- keyword 不会被分词器解析
- match 会模糊匹配
- term 会精确匹配(词),且会使用倒排索引,效率相对来说要高很多
- term+keyword 最精确查询
高亮查询
"highlight": {
"fields": {
"name": {}
}
}
默认高亮是em标签,我们还可以自定义标签和样式
总结!
- 匹配
- 按条件匹配
- 精确匹配
- 排序
- 区间范围匹配
- 区间过滤匹配
- 分页
- 单个字段 多条件匹配
- 高亮查询 自定义标签