查询语句优化
- 字段映射优化:
- 确保字段映射正确,特别是数据类型。例如,如果一个字段只存储数字,将其映射为
long
而不是text
类型。因为text
类型会进行分词处理,在数字查询时会增加不必要的开销。
- 示例:如果有一个
age
字段存储年龄,正确的映射应该是"age": {"type": "long"}
。
- 避免使用通配符查询:通配符查询(如
*
开头的查询)性能较差,尽量使用精确查询或前缀查询代替。
- 例如,不要使用
"query": {"wildcard": {"username": {"value": "*john"}}}
,可以使用前缀查询"query": {"prefix": {"username": "john"}}
,前提是业务允许。
- 使用布尔查询组合过滤条件:合理使用
bool
查询中的must
、should
、filter
等子句。filter
子句不参与评分,性能更好,对于不需要评分的过滤条件应放在filter
中。
{
"query": {
"bool": {
"filter": [
{"term": {"status": "active"}},
{"range": {"age": {"gte": 18}}}
],
"must": [
{"match": {"name": "john"}}
]
}
}
}
- 减少返回字段:只请求需要的字段,避免返回所有字段(
_source
),可以提高查询性能。
{
"_source": ["name", "age"],
"query": {
"match_all": {}
}
}
相关配置优化
- 索引优化:
- 合理设置分片数:根据数据量和硬件资源设置合适的分片数。如果分片数过多,会增加管理开销;过少则可能影响查询性能。例如,对于10GB左右的数据,初始设置5 - 10个分片可能比较合适。
- 启用索引存储优化:如
doc_values
,它能加快排序和聚合操作。对于需要排序或聚合的字段,确保doc_values
已启用(默认大多数数据类型启用)。例如,对于price
字段用于价格排序和聚合,确保其doc_values
是开启状态。
- 集群资源优化:
- 增加节点资源:如果查询性能瓶颈是由于资源不足导致,可以增加节点的内存、CPU等资源。例如,将节点的内存从8GB增加到16GB,可能会显著提升查询性能。
- 合理分配节点角色:在大型集群中,将数据节点、主节点和协调节点的角色分开。数据节点专注于存储和检索数据,主节点负责集群管理,协调节点处理客户端请求和分发查询,这样可以提高整体性能。例如,将处理复杂查询的节点设置为协调节点,并适当增加协调节点数量。