一、查询方式列举
1、多维度查询 关键词:bool must match
{
"query": {
"bool": {
"must": [
{
"match": {
"server_name": "www.test.com"
}
},
{
"range": { //时间查询
"createTime": {
"gte": "2025-04-14T00:00:00+08:00",
"lte": "2025-04-15T00:00:00+08:00"
}
}
}
]
}
},
"_source": {
"includes": [ //查询字段
"title",
"price"
],
"exclude": [ //排除字段
"organId"
]
}
}
2、模糊查询 关键词:wildcard
匹配出状态码status 以 5 开头的日志
{
"query": {
"wildcard": {"status": "5*"}
}
}
3、指定某个值 同时匹配多个字段 关键词:multi_match
query 要查询的值
fields 要匹配的字段【数组】
匹配出 字段code和status 为400的所有日志
{
"query": {
"multi_match": {
"query": "400",
"fields": [ "code", "status" ]
}
}
}
4、一个字段查询多个值
关键词:terms
{ "字段":[ 要匹配的多个值 ] }
{
"query": {
"terms": {
"status": ["400","402","406"]
}
}
}
5、字段排序
//单字段
{
"sort": {
"createTime": {
"order": "asc"
}
}
}
//多字段
{
"sort": [
{
"createTime": {
"order": "asc"
}
},
{
"updateTime": {
"order": "desc"
}
}
]
}
6、高量查询
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}
7、自定义高亮
{
"query": {
"term": {
"description": {
"value": "iphone"
}
}
},
"highlight": {
"post_tags": ["</span>"],
"pre_tags": ["<span style='color:red'>"],
"fields": {
"*":{}
}
}
}
8、模糊查询(fuzzy)
fuzzy 查询是 term 查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2:
GET /heima/_search
{
"query": {
"fuzzy": {
"title": {
"value":"appla",
"fuzziness":1
}
}
}
}
9、指定间隔分组
interval:间隔,
min_doc_count:过滤为0的分组
{
"size":0,
"aggs":{
"price":{
"histogram": {
"field": "price",
"interval": 5000,
"min_doc_count": 1
}
}
}
}
10、elasticsearch 深分页
产生原因:from、size 两字段过大,es默认是10000
解决方式:
(1)深度分页之scroll,滚动查询、每次请求两条。可以定制 scroll = 5m意味着该窗口过期时间为5分钟。
GET /student/_search?scroll=5m
{
"query": {
"match_all": {}
},
"size": 2
}
后边查询的时候需要带上 _scroll_id 参数
GET /_search/scroll
{
"scroll":"5m",
"scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAC0YFmllU"
}
(2)search_after 使用索引全局唯一标识字段 、官方推荐使用 _uid 作为全局唯一值,但是只要能表示其唯一性就可以。
GET /student/_search
{
"query":{
"match_all": {}
},
"size":2,
"sort":[
{
"uid": "desc"
}
]
}
下一次分页,需要将上述分页结果集的最后一条数据的值带上。
GET /student/student/_search
{
"query":{
"match_all": {}
},
"size":2,
"search_after":[1005],
"sort":[
{
"uid": "desc"
}
]
}
深分页对比
分页方式 | 性能 | 优点 | 缺点 | 场景 |
---|---|---|---|---|
from+size | 低 | 灵活性好,实现简单 | 深度分页问题 | 数据量比较小,能容忍深度分页问题 |
scroll | 中 | 解决了深度分页问题 | 无法反应数据的实时性(快照版本),维护成本高,需要维护一个 | 海量数据的导出需要查询海量结果集的数据 |
search_after | 高 | 性能最好、不存在深度分页问题、能够反映数据的实时变更 | 实现复杂,需要有一个全局唯一的字段、连续分页的实现比较复杂,因为每一次查询都需要上次查询的结果 | 海量数据的分页 |
注: ElasticSearch Java API之高级查询(分页查询,高亮查询,正则表达式查询,聚合查询等)
参考:
https://blog.csdn.net/qq_37774171/article/details/122931766
https://blog.csdn.net/qq_42402854/article/details/126615064