MST

星途 面试题库

面试题:ElasticSearch复杂查询与索引优化

在ElasticSearch中,有一个存储用户行为日志的索引,包含时间戳、用户ID、行为类型等字段。要求编写一个查询,找到在过去一周内,特定用户ID下出现频率最高的前5种行为类型,并说明如何对这个索引进行优化以提高查询性能。
23.1万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

查询语句

假设索引名为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"
                        }
                    }
                }
            ]
        }
    }
}

索引优化

  1. 字段映射优化
    • 对于行为类型这样的文本字段,使用keyword类型,避免分词,因为不需要对该字段进行全文检索,这样可以减少索引空间和提高聚合性能。
    • 对于时间戳字段,使用date类型,确保Elasticsearch能正确识别时间范围查询。
  2. 索引设置优化
    • 调整number_of_shardsnumber_of_replicas:根据数据量和服务器资源合理设置分片数和副本数。如果数据量较小,减少分片数可以降低管理开销;如果对高可用要求高,适当增加副本数。
    • 启用doc_values:对于需要排序、聚合的字段(如行为类型),确保doc_values是启用的,它能显著提高聚合和排序性能。
  3. 数据写入优化
    • 批量写入:使用批量操作(如bulk API),减少单个请求的次数,提高写入效率,同时减少网络开销。
    • 优化写入顺序:按照时间顺序写入数据,这样在查询时间范围时,Elasticsearch可以更高效地利用索引结构。
  4. 查询优化
    • 缓存:利用Elasticsearch的查询缓存(如filter cache),对于经常查询的时间范围和用户ID组合,缓存可以显著提高查询性能。
    • 避免大结果集:如上述查询设置size: 0,只获取聚合结果,不返回具体文档,减少数据传输和处理量。