弹性搜索中对出生日期字段的部分日期搜索

问题描述 投票:0回答:1

我有一个字段为dateofbirth,其映射如下所示“出生日期” : {“ type”:“ date”,“字段”:{“令牌”:{“ type”:“ text”}},“ ignore_malformed”:是的,“格式”:“ yyyy-MM-dd”},我有一个用例,需要在yyyydd&yyyy&yyyyMM的基础上进行搜索,在这种情况下,是否有人知道如何应用分析器,以便可以创建令牌进行搜索。

elasticsearch querydsl
1个回答
0
投票

以上有多种解决方法。

  1. 为年,月和日创建其他字段
{
  "mappings": {
    "properties": {
      "dateofbirth": {
        "type": "date",
        "fields": {
          "tokens": {
            "type": "text"
          }
        },
        "ignore_malformed": true,
        "format": "yyyy-MM-dd"
      },
      "year":{
        "type": "integer"
      },
      "month":{
        "type": "integer"
      },
      "day":{
        "type": "integer"
      }
    }
  }
}

您可以根据需要的格式使用多个术语子句进行查询

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "year": {
              "value": "VALUE"
            }
          }
        },
        {
          "term": {
            "month": {
              "value": "VALUE"
            }
          }
        }
      ]
    }
  }
}
  1. 使用范围查询。对于yyyydd
{
   "query": {
     "bool": {
        "must": [
          {
           "range": {
             "dateofbirth": {
               "gte": "2019-01-05",
               "lte": "2019-12-31"
             }
           }
          }
        ]
     }
   }
}

对于年份范围将是2019-01-01和2019-12-31。,对于yyyyMM范围将是2019-10-01和2019-10-31

  1. 使用脚本
{
   "query": {
     "bool": {
        "must": [
          {
            "script": {
              "script": {
                "source": "int year = doc['dateofbirth'].value.getYear();int month = doc['dateofbirth'].value.getMonthValue();int day = doc['dateofbirth'].value.getDayOfMonth(); if(year==params.year && month==params.month) return true;",
                "params": {
                  "year":2019,
                "month":10
                }
              }
            }
          }
        ]
     }
   }
}

选项1将具有最高的性能,其次是2和3。

© www.soinside.com 2019 - 2024. All rights reserved.