面试题答案
一键面试- 合理设计索引结构:
- 字段类型选择:选择合适的数据类型,例如数值类型用
long
、integer
等,避免使用通用的text
类型,因为text
类型会进行分词处理,增加存储和查询开销。 - 父子关系:如果数据有父子关系,合理使用父子文档(
parent - child
)或嵌套文档(nested
)结构,避免过度扁平化数据,减少冗余和提升查询效率。
- 字段类型选择:选择合适的数据类型,例如数值类型用
- 优化查询语句:
- 使用过滤上下文:在查询时,尽量使用过滤(
filter
)而不是查询(query
)上下文,filter
不会计算相关性分数,执行速度更快,且结果可以被缓存。 - 避免通配符查询:通配符查询(
wildcard
)性能较差,尽量避免使用。如果必须使用,将通配符置于词尾,减少扫描量。
- 使用过滤上下文:在查询时,尽量使用过滤(
- 调整索引设置:
- 分片与副本:根据数据量和硬件资源合理设置分片和副本数量。过多分片会增加管理开销,过少则可能影响性能和扩展性;副本数量也需平衡读性能和存储成本。
- 刷新间隔:适当增大
refresh_interval
,减少索引刷新频率,降低I/O开销,但这会导致数据近实时性降低。
- 使用缓存:
- 查询结果缓存:利用Elasticsearch的查询结果缓存机制,对于相同的查询可以直接从缓存获取结果,提升查询性能。
- 字段数据缓存:启用字段数据缓存,对经常用于排序、聚合的字段缓存数据,加快查询速度。