Date 使用Elasticsearch查找日期在特定日期附近的条目
如何使用elasticsearch搜索特定年龄的人? 所以如果我输入28岁作为年龄,我希望28岁的人得分最高,但也希望27岁的人被显示出来,但得分较低。 出生日期存储为以下格式yyyy mm dd,因此我必须将年龄转换为日期,但这没有问题 到目前为止,我有以下几点:Date 使用Elasticsearch查找日期在特定日期附近的条目,date,elasticsearch,dsl,Date,elasticsearch,Dsl,如何使用elasticsearch搜索特定年龄的人? 所以如果我输入28岁作为年龄,我希望28岁的人得分最高,但也希望27岁的人被显示出来,但得分较低。 出生日期存储为以下格式yyyy mm dd,因此我必须将年龄转换为日期,但这没有问题 到目前为止,我有以下几点: { "query": { "fuzzy": { "birthdate": { "value": "1985-10-01",
{
"query": {
"fuzzy": {
"birthdate": {
"value": "1985-10-01",
"min_similarity": "1096d"
}
}
}
}
1096d的min_相似性意味着1985年10月1日出生的人+/-3年
所以所有1982年到1988年出生的人都被展示出来了——这非常有效,但是他们都有相同的分数1.0。生日最接近1985-10-01的条目如何获得最高分数?您可以使用脚本计算自定义分数。此脚本使用SimpleDataFormat解析日期(1985-10-01),然后计算该日期(以毫秒为单位)减去文档日期(以毫秒为单位)的绝对值。您首先需要最低的值(最接近目标日期),因此按分数升序排序,而不是按默认的降序排序
{
"query": {
"custom_score": {
"query": {
"fuzzy": {
"birthdate": {
"value": "1985-10-01",
"min_similarity": "1096d"
}
}
},
"script": "abs(new \
java.text.SimpleDateFormat('yyyy-MM-dd').parse('1985-10-01').getTime() - \
doc['birthdate'].date.getMillis())"
}
},
"sort": [
{ "_score": "asc" }
]
}
有关自定义分数的更多信息是您可以使用脚本计算自定义分数。此脚本使用SimpleDataFormat解析日期(1985-10-01),然后计算该日期(以毫秒为单位)减去文档日期(以毫秒为单位)的绝对值。您首先需要最低的值(最接近目标日期),因此按分数升序排序,而不是按默认的降序排序
{
"query": {
"custom_score": {
"query": {
"fuzzy": {
"birthdate": {
"value": "1985-10-01",
"min_similarity": "1096d"
}
}
},
"script": "abs(new \
java.text.SimpleDateFormat('yyyy-MM-dd').parse('1985-10-01').getTime() - \
doc['birthdate'].date.getMillis())"
}
},
"sort": [
{ "_score": "asc" }
]
}
有关自定义评分的更多信息,请参见也可以使用衰减函数而不是自定义脚本: