Частичный поиск по дате поля рождения в Elastic Search - PullRequest
0 голосов
/ 31 октября 2019

У меня есть одно поле dateofbirth, отображение которого выглядит примерно так: dateofbirth: {"type": "date", "fields": {"tokens": {"type": "text"}}, "ignore_malformed ": true," format ":" yyyy-MM-dd "}, у меня есть вариант использования, где мне нужно искать на основе yyyydd & yyyy & yyyyMM, знает ли кто-нибудь, как применять анализатор в таком случае,так что токены могут быть созданы для поиска.

1 Ответ

0 голосов
/ 31 октября 2019

Существует много способов решения выше.

  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"
            }
          }
        }
      ]
    }
  }
}
Использование запроса диапазона. Для ггггд
{
   "query": {
     "bool": {
        "must": [
          {
           "range": {
             "dateofbirth": {
               "gte": "2019-01-05",
               "lte": "2019-12-31"
             }
           }
          }
        ]
     }
   }
}

Для года диапазон будет 2019-01-01 и 2019-12-31., Для ггггМ диапазон будет 2019-10-01 и 2019-10-31

Использование сценария
{
   "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.

...