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 性能排序(从快到慢)

  1. Filter查询(最快,有缓存)
  2. Term查询
  3. Range查询
  4. Match查询
  5. Wildcard查询
  6. Regexp查询(最慢)

10.2 优化技巧

  • 优先使用filter而非query
  • 合理使用bool查询的不同子句
  • 避免在大字段上使用wildcard
  • 使用keyword类型进行精确匹配
  • 合理设置分片和副本数量

面试常考点总结

  1. 基础查询:term vs match的区别
  2. 布尔查询:must、should、filter的区别和使用场景
  3. 性能优化:filter vs query的性能差异
  4. 全文搜索:分词器的作用和影响
  5. 复合查询:如何组合多种查询类型

结语

Elasticsearch提供了丰富的查询方式来满足不同的搜索需求。在实际应用中,需要根据具体场景选择合适的查询类型,并注意性能优化。掌握这些查询方式对于ES开发和面试都至关重要。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐