【问题标题】:Use Elasticsearch to find entries with date around a specific date使用 Elasticsearch 查找日期在特定日期前后的条目
【发布时间】:2018-03-24 01:41:50
【问题描述】:

如何使用 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 的条目如何获得最高分?

【问题讨论】:

    标签: date elasticsearch dsl


    【解决方案1】:

    您可以使用脚本计算自定义分数。此脚本使用 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/

    【讨论】:

    • 哇!这很好用!感谢您提出如何完成这项工作并提供所需代码的想法!在代码的脚本部分中,有 2 个带“\”的换行符。为了使代码正常工作,我必须删除换行符和斜杠。也许您将它们从代码中删除,以便每个人都可以复制它。
    • 文档链接已损坏 :(
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多