MST

星途 面试题库

面试题:ElasticSearch脚本字段复杂逻辑处理

在ElasticSearch索引中有文档记录员工信息,包括入职时间(date类型)、基本工资(numeric类型)。现在要根据员工入职时间是否超过5年,对基本工资进行不同的调整(超过5年增加20%,未超过5年增加10%),并通过脚本字段在搜索结果中展示调整后的工资。请详细说明实现思路并给出完整的查询DSL。
49.7万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 使用script_fields在搜索结果中创建一个新的字段来展示调整后的工资。
    • 在脚本中,通过doc['入职时间字段名'].value获取员工入职时间,与当前时间比较判断是否超过5年。这里假设当前时间获取可以通过System.currentTimeMillis(),并将5年转换为毫秒数(5 * 365 * 24 * 60 * 60 * 1000)进行比较。
    • 根据判断结果对doc['基本工资字段名'].value进行相应的百分比调整(超过5年增加20%,未超过5年增加10%)。
  2. 完整的查询DSL
{
    "query": {
        "match_all": {}
    },
    "script_fields": {
        "调整后工资": {
            "script": {
                "lang": "painless",
                "source": "def currentTime = System.currentTimeMillis(); def fiveYearsInMillis = 5 * 365 * 24 * 60 * 60 * 1000; if (currentTime - doc['入职时间字段名'].value.getMillis() > fiveYearsInMillis) { return doc['基本工资字段名'].value * 1.2; } else { return doc['基本工资字段名'].value * 1.1; }"
            }
        }
    }
}

请将上述DSL中的入职时间字段名基本工资字段名替换为实际在ElasticSearch索引中对应的字段名。