1

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

到目前为止,我有以下内容:

{
    "query": {
        "fuzzy": {
            "birthdate": {
                "value": "1985-10-01",
                "min_similarity": "1096d"
            }
        }
    }
}

1096d 的 min_similarity 表示出生于 1985 年 10 月 1 日 +/- 3 年的人。

所以所有出生在 1982 年到 1988 年之间的人都会被显示出来——这很好用,但他们都有相同的 1.0 分。如何获得最接近 1985-10-01 生日的条目的最高分?

4

2 回答 2

4

您可以使用脚本计算自定义分数。此脚本使用 SimpleDateFormat 解析您的日期 (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" }
  ]
}

有关自定义评分的更多信息是http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query/

于 2013-10-02T16:10:08.283 回答
0

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

于 2018-03-23T17:41:50.607 回答