Elasticsearch按部分日期过滤

Arm*_*tis 5 elasticsearch

问题也许有人有解决方案如何按月或按天过滤/查询ElasticSearch数据?假设我需要获得今天庆祝生日的所有用户.

制图


mappings:
    dob: { type: date, format: "dd-MM-yyyy HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss'Z'||yyyy-MM-dd'T'HH:mm:ss+SSSS"}
Run Code Online (Sandbox Code Playgroud)

并以这种方式存储:

 dob: 1950-06-03T00:00:00Z 

主要问题是如何按月和日搜索用户.忽略这一年,因为生日是我们所知道的每年.


解决方案 我找到了使用通配符查询生日的解决方案.我们知道如果我们想要使用通配符,则字段的映射必须是字符串,因此我使用了多字段映射.


mappings:
    dob:
        type: multi_field
        fields:
            dob: { type: date, format: "yyyy-MM-dd'T'HH:mm:ss'Z'}
            string: { type: string, index: not_analyzed }
Run Code Online (Sandbox Code Playgroud)

和查询仅按月和日获取用户是:

{
    "query": {
        "wildcard": {
            "dob.string": "*-06-03*"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意 此查询可能很慢,因为它需要迭代多个术语.

结论 这不是很好的方式,但它是我发现的唯一一个,它的工作原理!

wbe*_*ett 1

根据您的问题,我假设您想要一个查询,而不是一个过滤器(它们是不同的),您可以将日期数学/格式与范围查询结合使用。

请参阅:范围查询的用法

有关日期数学的解释,请参阅以下链接

curl -XPOST http://localhost:9200/twitter/tweet/_search -d

{
  "query": {
    "range": {
        "birthday": {
            "gte" : "2014-01-01",
            "lte" : "2014-01-01"
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经用最新的弹性搜索对此进行了测试。

  • 不起作用:问题询问如何选择今天庆祝生日的用户,但存储的值是出生日期(例如,搜索 05-20 时,1980-05-20 和 1990-05-20 应匹配)。 (2认同)