Elasticsearch数据查询搜索方式详解 - 面试必备
·
Elasticsearch数据查询搜索方式详解 - 面试必备
前言
Elasticsearch作为一个分布式搜索和分析引擎,提供了丰富多样的查询方式来满足不同场景的搜索需求。在面试中,这是一个高频考点。本文将详细介绍Elasticsearch支持的各种查询搜索方式。
1. 基础查询类型
1.1 Match All Query(匹配所有查询)
{
"query": {
"match_all": {}
}
}
- 用途:返回所有文档
- 场景:测试、获取全量数据
1.2 Term Query(精确匹配查询)
{
"query": {
"term": {
"status": "published"
}
}
}
- 特点:不分词,精确匹配
- 适用:keyword类型字段、数字、日期等
1.3 Terms Query(多值精确匹配)
{
"query": {
"terms": {
"status": ["published", "draft"]
}
}
}
2. 全文搜索查询
2.1 Match Query(匹配查询)
{
"query": {
"match": {
"title": "elasticsearch tutorial"
}
}
}
- 特点:会对查询词进行分词
- 默认操作符:OR
2.2 Match Phrase Query(短语匹配)
{
"query": {
"match_phrase": {
"content": "machine learning"
}
}
}
- 特点:保持词序,精确短语匹配
2.3 Multi Match Query(多字段匹配)
{
"query": {
"multi_match": {
"query": "elasticsearch",
"fields": ["title^2", "content"]
}
}
}
- 功能:在多个字段中搜索
- 支持:字段权重设置(^2表示权重为2)
3. 范围查询
3.1 Range Query(范围查询)
{
"query": {
"range": {
"age": {
"gte": 18,
"lte": 65
}
}
}
}
- 操作符:
gte:大于等于gt:大于lte:小于等于lt:小于
3.2 日期范围查询
{
"query": {
"range": {
"created_date": {
"gte": "2024-01-01",
"lte": "2024-12-31",
"format": "yyyy-MM-dd"
}
}
}
}
4. 布尔查询
4.1 Bool Query(布尔查询)
{
"query": {
"bool": {
"must": [
{"match": {"title": "elasticsearch"}}
],
"must_not": [
{"term": {"status": "deleted"}}
],
"should": [
{"match": {"tags": "tutorial"}}
],
"filter": [
{"range": {"publish_date": {"gte": "2024-01-01"}}}
]
}
}
}
布尔查询子句说明:
- must:必须匹配,影响评分
- must_not:必须不匹配,不影响评分
- should:可以匹配,影响评分
- filter:必须匹配,不影响评分(性能更好)
5. 模糊查询
5.1 Fuzzy Query(模糊查询)
{
"query": {
"fuzzy": {
"name": {
"value": "elasticsearch",
"fuzziness": "AUTO"
}
}
}
}
- 用途:处理拼写错误
- fuzziness:编辑距离
5.2 Wildcard Query(通配符查询)
{
"query": {
"wildcard": {
"name": "ela*search"
}
}
}
- 通配符:
*(多个字符)、?(单个字符)
5.3 Regexp Query(正则表达式查询)
{
"query": {
"regexp": {
"email": ".*@gmail\\.com"
}
}
}
6. 前缀和存在性查询
6.1 Prefix Query(前缀查询)
{
"query": {
"prefix": {
"name": "ela"
}
}
}
6.2 Exists Query(存在查询)
{
"query": {
"exists": {
"field": "email"
}
}
}
7. 地理位置查询
7.1 Geo Distance Query(地理距离查询)
{
"query": {
"geo_distance": {
"distance": "10km",
"location": {
"lat": 40.7128,
"lon": -74.0060
}
}
}
}
7.2 Geo Bounding Box Query(地理边界框查询)
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 40.8,
"lon": -74.1
},
"bottom_right": {
"lat": 40.7,
"lon": -74.0
}
}
}
}
}
8. 嵌套查询
8.1 Nested Query(嵌套查询)
{
"query": {
"nested": {
"path": "comments",
"query": {
"bool": {
"must": [
{"match": {"comments.author": "john"}},
{"range": {"comments.date": {"gte": "2024-01-01"}}}
]
}
}
}
}
}
9. 高级查询特性
9.1 Function Score Query(函数评分查询)
{
"query": {
"function_score": {
"query": {"match": {"title": "elasticsearch"}},
"functions": [
{
"filter": {"term": {"featured": true}},
"weight": 2
}
]
}
}
}
9.2 Script Query(脚本查询)
{
"query": {
"script": {
"script": {
"source": "doc['price'].value > params.min_price",
"params": {
"min_price": 100
}
}
}
}
}
10. 查询性能优化建议
10.1 性能排序(从快到慢)
- Filter查询(最快,有缓存)
- Term查询
- Range查询
- Match查询
- Wildcard查询
- Regexp查询(最慢)
10.2 优化技巧
- 优先使用filter而非query
- 合理使用bool查询的不同子句
- 避免在大字段上使用wildcard
- 使用keyword类型进行精确匹配
- 合理设置分片和副本数量
面试常考点总结
- 基础查询:term vs match的区别
- 布尔查询:must、should、filter的区别和使用场景
- 性能优化:filter vs query的性能差异
- 全文搜索:分词器的作用和影响
- 复合查询:如何组合多种查询类型
结语
Elasticsearch提供了丰富的查询方式来满足不同的搜索需求。在实际应用中,需要根据具体场景选择合适的查询类型,并注意性能优化。掌握这些查询方式对于ES开发和面试都至关重要。
更多推荐



所有评论(0)