面试题答案
一键面试思路
- 分页大小调整:
- 避免一次性获取大量数据。对于数十亿文档的查询,若初始分页大小过大,会占用过多内存和网络资源。可以采用较小的分页大小,如
size=100
(具体数值需根据实际情况测试调整),通过多次请求获取全部结果。例如,利用from
参数指定偏移量,from=0
获取第一页,from=100
获取第二页,以此类推。
- 避免一次性获取大量数据。对于数十亿文档的查询,若初始分页大小过大,会占用过多内存和网络资源。可以采用较小的分页大小,如
- 缓存设置:
- 利用ElasticSearch的查询缓存。可以通过设置索引级别的缓存,对于一些不经常变化的数据,开启字段数据缓存(field data cache),但要注意内存限制。对于经常变化的数据,慎用缓存。可以使用
PUT /index_name/_settings
API来设置缓存相关参数,例如:
上述设置表示为索引开启查询缓存,缓存类型为{ "index": { "query": { "cache": { "type": "filter", "size": "5%", "expire": "10m" } } } }
filter
,缓存大小占节点堆内存的5%,缓存过期时间为10分钟。 - 利用ElasticSearch的查询缓存。可以通过设置索引级别的缓存,对于一些不经常变化的数据,开启字段数据缓存(field data cache),但要注意内存限制。对于经常变化的数据,慎用缓存。可以使用
- 数据单位换算:
- 在设置缓存大小时,
size
参数可以用百分比(如5%
),也可以用字节数表示(如1024mb
)。要根据集群节点内存实际情况换算。例如,如果知道节点总内存为16GB,按照5%计算,缓存大小为0.8GB
,换算为字节数就是838860800
字节,可设置size=838860800
。同时,在设置分页时,数据单位虽不直接体现在size
参数,但要意识到每次获取的数据量(如size=100
条文档)对应的内存占用,根据文档平均大小估算对内存的影响。
- 在设置缓存大小时,
可能用到的API操作
- 分页相关API:
- 使用
GET /_search
API进行查询并设置分页参数。例如:
{ "query": { // 复杂查询条件 }, "from": 0, "size": 100 }
- 使用
- 缓存相关API:
- 设置索引缓存:
PUT /index_name/_settings
,如前文示例设置查询缓存参数。 - 清除缓存:可以使用
POST /index_name/_cache/clear
API清除指定索引的缓存,当数据发生重大变化时,确保缓存数据及时更新。例如,若数据更新后查询结果不准确,可通过此API清除缓存后重新查询。
- 设置索引缓存: