面试题答案
一键面试查询语句
假设索引名为user_behavior_logs
,可以使用以下DSL
查询:
{
"size": 0,
"aggs": {
"top_5_actions": {
"terms": {
"field": "行为类型.keyword",
"size": 5
}
}
},
"query": {
"bool": {
"filter": [
{
"match": {
"用户ID": "特定用户ID"
}
},
{
"range": {
"时间戳": {
"gte": "now-1w"
}
}
}
]
}
}
}
索引优化
- 字段映射优化
- 对于
行为类型
这样的文本字段,使用keyword
类型,避免分词,因为不需要对该字段进行全文检索,这样可以减少索引空间和提高聚合性能。 - 对于
时间戳
字段,使用date
类型,确保Elasticsearch能正确识别时间范围查询。
- 对于
- 索引设置优化
- 调整
number_of_shards
和number_of_replicas
:根据数据量和服务器资源合理设置分片数和副本数。如果数据量较小,减少分片数可以降低管理开销;如果对高可用要求高,适当增加副本数。 - 启用
doc_values
:对于需要排序、聚合的字段(如行为类型
),确保doc_values
是启用的,它能显著提高聚合和排序性能。
- 调整
- 数据写入优化
- 批量写入:使用批量操作(如
bulk
API),减少单个请求的次数,提高写入效率,同时减少网络开销。 - 优化写入顺序:按照时间顺序写入数据,这样在查询时间范围时,Elasticsearch可以更高效地利用索引结构。
- 批量写入:使用批量操作(如
- 查询优化
- 缓存:利用Elasticsearch的查询缓存(如
filter cache
),对于经常查询的时间范围和用户ID组合,缓存可以显著提高查询性能。 - 避免大结果集:如上述查询设置
size: 0
,只获取聚合结果,不返回具体文档,减少数据传输和处理量。
- 缓存:利用Elasticsearch的查询缓存(如