面试题答案
一键面试优化选择字段操作减少性能损耗
- 使用
_source
过滤:在GET请求中,通过_source
参数指定需要获取的特定字段。例如:
GET /logs/_doc/{document_id}? _source=field1,field2,field3
这样Elasticsearch只会从文档中提取指定的字段,而不是返回整个文档,大大减少了数据传输量和处理开销。
2. 预索引字段:如果可能,对经常查询的字段进行预索引。例如,使用mapper-murmur3
插件对某些字段进行哈希预索引,这样在查询时可以更快地定位数据,提高查询效率。
3. 缓存机制:引入缓存层(如Redis),将高频查询的结果缓存起来。在高并发场景下,首先检查缓存中是否有需要的数据,如果有则直接返回,避免重复查询Elasticsearch,降低集群压力。
优雅处理文档缺少字段的情况
- 设置默认值:在Elasticsearch的映射(mapping)中,为可能缺失的字段设置默认值。例如:
{
"mappings": {
"properties": {
"field1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
},
"null_value": "N/A"
}
}
}
}
这样当文档中缺少field1
字段时,Elasticsearch会返回默认值"N/A"
,而不是抛出错误。
2. 使用脚本处理:在请求中使用脚本(如Painless脚本)来处理缺失字段的情况。例如:
GET /logs/_search
{
"script_fields": {
"field1": {
"script": {
"source": "doc.containsKey('field1') ? doc['field1'].value : 'default_value'",
"lang": "painless"
}
}
}
}
这个脚本会检查文档是否包含field1
字段,如果包含则返回该字段的值,否则返回默认值"default_value"
。这样可以在查询时动态处理缺失字段,而不影响整体业务逻辑。