【问题标题】:Elasticsearch date query. People who were born in a certain monthElasticsearch 日期查询。某月出生的人
【发布时间】:2015-12-14 22:03:57
【问题描述】:

我有一个具有以下映射的字段:

birthdate: { type: :date, format: :dateOptionalTime }
  1. 我需要找到所有出生在 5 月份(包括所有年份)的人
  2. 另一个查询是查找所有出生于“8 月 25 日”的人(包括所有年份)

对此的查询是什么?

【问题讨论】:

    标签: elasticsearch elasticsearch-mapping elasticsearch-dsl elasticsearch-query


    【解决方案1】:

    您可以通过script filter 实现此目的

    任何一年五月出生的人:

    {
      "query": {
        "filtered": {
          "filter": {
            "script": {
              "script": "doc.birthdate.date.monthOfYear == 5"
            }
          }
        }
      }
    }
    

    所有出生于 8 月 25 日(任何年份)的人

    {
      "query": {
        "filtered": {
          "filter": {
            "script": {
              "script": "doc.birthdate.date.monthOfYear == 8 && doc.birthdate.date.dayOfMonth == 25"
            }
          }
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      仅仅为了存档,ES 7 带来了一些制动变化https://www.elastic.co/guide/en/elasticsearch//reference/current/breaking-changes-7.0.html#_getdate_and_getdates_removed

      现在是:

      POST /people/_search?size=50
      {
        "query": {
          "bool" : {
            "filter" : {
             "script" : {
                "script" : {
                  "source": "doc['jour'].value.getMonthValue() == 5",
                  "lang": "painless"
                }
              }
            }
          }
        }
      }
      
      【解决方案3】:
      GET index_name/doc_type/_search
      {
          "query": {
              "bool" : {
                  "filter" : {
                      "script" : {
                          "script" : {
                              "source": "doc.field_name.date.getMonthOfYear() == month_number",
                              "lang": "painless"
                           }
                      }
                  }
              }
          }
      }
      

      【讨论】:

      • 您能解释一下这与接受的答案有何不同吗?谢谢。
      • 最新版本不支持过滤
      【解决方案4】:

      第一个问题:

      POST /test_index/_search
      {
         "query": {
            "filtered": {
               "filter": {
                  "range": {
                     "birthdate": {
                        "gte": "2015-05-01",
                        "lt": "2015-06-01"
                     }
                  }
               }
            }
         }
      }
      

      第二个问题:

      POST /test_index/_search
      {
         "query": {
            "filtered": {
               "filter": {
                  "range": {
                     "birthdate": {
                        "gte": "2015-08-25",
                        "lte": "2015-08-25"
                     }
                  }
               }
            }
         }
      }
      

      这是我用来测试它的代码:

      http://sense.qbox.io/gist/36c800cabbe4143ecf72144d02e58e267c1e761a

      【讨论】:

      • 感谢您的回答,但我可能不够具体。我需要获得所有年份的结果,而不仅仅是 2015 年
      • 是的,这是一个非常不同的问题。
      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2017-03-22
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多