Elastic Search中的“出生日期”字段的部分日期搜索

时间:2019-10-31 14:35:46

标签: elasticsearch querydsl

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

1 个答案:

答案 0 :(得分: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。