elasticsearch,dsl,Date,elasticsearch,Dsl" /> elasticsearch,dsl,Date,elasticsearch,Dsl" />

Date 使用Elasticsearch查找日期在特定日期附近的条目

Date 使用Elasticsearch查找日期在特定日期附近的条目,date,elasticsearch,dsl,Date,elasticsearch,Dsl,如何使用elasticsearch搜索特定年龄的人? 所以如果我输入28岁作为年龄,我希望28岁的人得分最高,但也希望27岁的人被显示出来,但得分较低。 出生日期存储为以下格式yyyy mm dd,因此我必须将年龄转换为日期,但这没有问题 到目前为止,我有以下几点: { "query": { "fuzzy": { "birthdate": { "value": "1985-10-01",

如何使用elasticsearch搜索特定年龄的人? 所以如果我输入28岁作为年龄,我希望28岁的人得分最高,但也希望27岁的人被显示出来,但得分较低。 出生日期存储为以下格式yyyy mm dd,因此我必须将年龄转换为日期,但这没有问题

到目前为止,我有以下几点:

{
    "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" }
  ]
}

有关自定义评分的更多信息,请参见

也可以使用衰减函数而不是自定义脚本:


也可以使用衰减函数而不是自定义脚本来完成:


哇!这很有效!感谢您提出了如何完成此任务并提供所需代码的想法!在代码的脚本部分有两个带“\”的换行符。为了让代码正常工作,我必须删除换行符和斜线。也许你可以从你的代码中删除它们,这样每个人都可以复制它。doc链接断开了:(哇!这很好!感谢你提出了如何完成这项工作并提供所需代码的想法!在代码的脚本部分有两个带“\”的换行符。为了让代码正常工作,我必须删除换行符和斜杠。也许你可以从代码中删除它们,这样每个人都可以复制。doc链接已断开:(