elasticsearch 查询检索
一、查询方式列举
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