MST
星途 面试题库

面试题:ElasticSearch搜索性能优化之查询优化

假设你有一个复杂的ElasticSearch查询,涉及多个字段的联合查询和过滤,并且查询性能较差。请阐述从查询语句本身和相关配置方面如何进行优化,以提高查询效率,并举例说明。
34.1万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

查询语句优化

  1. 字段映射优化
    • 确保字段映射正确,特别是数据类型。例如,如果一个字段只存储数字,将其映射为long而不是text类型。因为text类型会进行分词处理,在数字查询时会增加不必要的开销。
    • 示例:如果有一个age字段存储年龄,正确的映射应该是"age": {"type": "long"}
  2. 避免使用通配符查询:通配符查询(如*开头的查询)性能较差,尽量使用精确查询或前缀查询代替。
    • 例如,不要使用"query": {"wildcard": {"username": {"value": "*john"}}},可以使用前缀查询"query": {"prefix": {"username": "john"}},前提是业务允许。
  3. 使用布尔查询组合过滤条件:合理使用bool查询中的mustshouldfilter等子句。filter子句不参与评分,性能更好,对于不需要评分的过滤条件应放在filter中。
    • 示例:
{
    "query": {
        "bool": {
            "filter": [
                {"term": {"status": "active"}},
                {"range": {"age": {"gte": 18}}}
            ],
            "must": [
                {"match": {"name": "john"}}
            ]
        }
    }
}
  1. 减少返回字段:只请求需要的字段,避免返回所有字段(_source),可以提高查询性能。
    • 示例:
{
    "_source": ["name", "age"],
    "query": {
        "match_all": {}
    }
}

相关配置优化

  1. 索引优化
    • 合理设置分片数:根据数据量和硬件资源设置合适的分片数。如果分片数过多,会增加管理开销;过少则可能影响查询性能。例如,对于10GB左右的数据,初始设置5 - 10个分片可能比较合适。
    • 启用索引存储优化:如doc_values,它能加快排序和聚合操作。对于需要排序或聚合的字段,确保doc_values已启用(默认大多数数据类型启用)。例如,对于price字段用于价格排序和聚合,确保其doc_values是开启状态。
  2. 集群资源优化
    • 增加节点资源:如果查询性能瓶颈是由于资源不足导致,可以增加节点的内存、CPU等资源。例如,将节点的内存从8GB增加到16GB,可能会显著提升查询性能。
    • 合理分配节点角色:在大型集群中,将数据节点、主节点和协调节点的角色分开。数据节点专注于存储和检索数据,主节点负责集群管理,协调节点处理客户端请求和分发查询,这样可以提高整体性能。例如,将处理复杂查询的节点设置为协调节点,并适当增加协调节点数量。