elasticsearch 如何在elasticsearch中映射人的年龄,使其保持真实
我想知道是否有一种特殊的方法将一个人的出生日期映射到一个年龄。 天真的方法是对一个人的当前年龄进行索引。但明年的年龄将有所不同。然后我必须更新个人文档
elasticsearch 如何在elasticsearch中映射人的年龄,使其保持真实,
elasticsearch,lucene,mapping,
elasticsearch,Lucene,Mapping,我想知道是否有一种特殊的方法将一个人的出生日期映射到一个年龄。 天真的方法是对一个人的当前年龄进行索引。但明年的年龄将有所不同。然后我必须更新个人文档 我想知道是否有更复杂的方法来解决这个问题 您需要为此人的出生日期编制索引,然后您可以使用一个将计算此人到目前为止的年龄的 例如,假设您有这样一个person文档: { "first_name": "John", "last_name": "Doe", "birth_date": "1984-10-12T00:00:00.000Z" }
我想知道是否有更复杂的方法来解决这个问题 您需要为此人的出生日期编制索引,然后您可以使用一个将计算此人到目前为止的年龄的 例如,假设您有这样一个person文档:
{
"first_name": "John",
"last_name": "Doe",
"birth_date": "1984-10-12T00:00:00.000Z"
}
然后可以发出以下查询:
POST persons/_search
{
"query" : {
"match_all": {}
},
"script_fields" : {
"age" : {
"script" : {
"source": "ChronoUnit.YEARS.between(LocalDateTime.parse(ctx._source.birth_date, DateTimeFormatter.ISO_OFFSET_DATE_TIME), new LocalDateTime());"
}
}
}
}
使用从(ES 7.4)中收集的信息,我在Kibana脚本字段中使用下面的“painless
”代码计算年龄:
Instant instant = Instant.ofEpochMilli(new Date().getTime());
ZonedDateTime birth = doc['date_of_birth'].value;
ZonedDateTime now = ZonedDateTime.ofInstant(instant, ZoneId.of('Z'));
ChronoUnit.YEARS.between(birth, now)
如果我的理解是正确的,这个多行脚本可以使用三个引号传递给cURL。我尝试执行您的查询(在Kibana的开发工具控制台中),得到了以下结果:
“原因”:“构造函数[java.time.LocalDateTime,/0]未找到”
。有什么想法吗?我想用卷发我也会得到同样的结果。你用的是哪个版本的ES?谢谢你的回答:ES 7.4。我在此基础上提出了一个解决方案,我将在下面发布。@Herrlvan-显然无痛地只支持Java规范的子集。。看看这个-