【问题标题】:Elasticsearch filter by year from a date fieldElasticsearch 从日期字段中按年份过滤
【发布时间】:2019-05-15 17:05:00
【问题描述】:

我有日期字段格式为 yyyy-MM-dd 的文档。有没有办法只根据字段的年份部分进行过滤。

示例:

{'name': 'a', 'born': '1984-11-22'},
{'name': 'b', 'born': '1984-12-12'},
{'name': 'c', 'born': '1985-10-22'},

我想做一个术语/范围过滤器来查找出生于 1984 年的人。 非常感谢任何帮助。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:
    "query": {
            "filtered": {
               "filter": {
                   "range": {
                      "born": {
                         "gte": "1984||/y",
                         "lte": "1984||/y",
                         "format": "yyyy"
                      }
                   }
               }
            }
        }
    

    除了添加格式之外,这还需要对输入年份参数进行四舍五入。如果不按年份四舍五入,范围查询将无法按预期工作。尝试了多种日期格式,例如 dateOptionalTime、日期等。

    有关如何使用日期数学的详细信息,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html

    【讨论】:

    • 只有这对我适用于 elasticsearch 7.12。谢谢!
    【解决方案2】:

    是的,您可以使用 range filter 并指定年份 format

    {
        "constant_score": {
            "filter": {
                "range" : {
                    "born" : {
                        "gte": "1984",
                        "lte": "1984",
                        "format": "yyyy"
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 这不正确,您需要使用日期数学来查询确切的年份,请参阅:elastic.co/guide/en/elasticsearch/reference/current/…
    • @Jaap 是的,正如 OP 状态的另一个答案
    • 没错,这只是为了解释为什么这个(以前被赞成的)答案不是正确的,因为这两个答案都没有被 OP 接受。
    • OP自言自语所以他没有费心接受:-)
    • @Val 我想要 2017 年 1 月 1 日到 2017 年 12 月 31 日的确切范围
    【解决方案3】:

    根据文档,解决方案是:

    GET _search
    {
        "query": {
            "range" : {
                "born" : {
                    "gte": "1984",
                    "lt": "1985",
                    "format": "yyyy"
                }
            }
        }
    }
    

    【讨论】:

    • 这不行,用lte代替lt,否则你的条件永远不会成立。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2015-09-20
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多