【问题标题】:Partial date search on Date Of Birth Fields in Elastic Search弹性搜索中出生日期字段的部分日期搜索
【发布时间】:2019-11-01 00:02:16
【问题描述】:

我有一个字段是 dateofbirth,其映射如下所示 “出生日期” : { “类型”:“日期”, “字段”:{ “代币”:{ “类型”:“文本” } }, “ignore_malformed”:是的, “格式”:“yyyy-MM-dd” }, 我有一个用例,我需要根据 yyyydd & yyyy & yyyyMM 进行搜索,有没有人知道在这种情况下如何应用分析器,以便可以创建令牌进行搜索。

【问题讨论】:

    标签: elasticsearch querydsl


    【解决方案1】:

    上面有很多方法可以解决。

    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. 使用范围查询。 对于年年日
    {
       "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。

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多