Elasti c Поиск диапазона дат Запрос - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в поиске elasti c, и я борюсь с запросом диапазона дат. Я должен запросить записи, которые попадают между определенными датами. Записи JSON, помещенные в базу данных поиска elasti c, выглядят следующим образом:

                "messageid": "Some message id",
                "subject": "subject",
                "emaildate": "2020-01-01 21:09:24",
                "starttime": "2020-01-02 12:30:00",
                "endtime": "2020-01-02 13:00:00",
                "meetinglocation": "some location",
                "duration": "00:30:00",
                "employeename": "Name",
                "emailid": "abc@xyz.com",
                "employeecode": "141479",
                "username": "username",
                "organizer": "Some name",
                "organizer_email": "cde@xyz.com",

Мне нужно запросить записи, у которых есть время начала между «2020-01-02 12:30:00» до «2020-01-10 12:30:00». Я написал такой запрос:

{
   "query":
      {
        "bool":
           {

              "filter": [
                {
                    "range" : {
                        "starttime": { 
                             "gte": "2020-01-02 12:30:00", 
                             "lte": "2020-01-10 12:30:00" 
                         }
                    }
                }
              ]            
           } 
      }
}

Этот запрос не дает ожидаемых результатов. Я предполагаю, что человек, который поместил данные в поисковую базу данных elasti c в моем офисе, не установил отображение, а Elasti c Search динамически определяет тип данных «время начала» как «текст». Следовательно, я получаю противоречивые результаты. Я могу установить сопоставление следующим образом:

PUT /meetings
{
  "mappings": {
    "dynamic": false,
    "properties": {
        .
        .
        .
        .
      "starttime": {
        "type": "date",
        "format":"yyyy-MM-dd HH:mm:ss"
      }
        .
        .
        .
    }
  }
}

И запрос будет работать, но мне не разрешено это делать (офисные политики). Какие у меня есть альтернативы, чтобы я мог выполнить свою задачу.

Обновление:

Я предположил, что тип данных - "Текст", но по умолчанию Elasti c Поиск применяет как «Текст», так и «Ключевое слово», чтобы мы могли осуществлять поиск как по полному тексту, так и по ключевым словам. Если он также установлен как «Ключевое слово». Будет ли это полезно для меня в любом случае. У меня нет доступа ко многим вещам в офисе, поэтому я не могу отладить запрос. У меня есть только API поиска, для которого мне нужно построить запрос.

GET / встречи / _mapping выходные данные:

  '
  '
  '
 "starttime" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
  }

    '
    '
    ' 

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Запросы диапазона дат не будут работать с текстовым полем, для этого вам необходимо использовать поле даты

Поскольку вы работаете с полями даты, рекомендуется использовать поле даты.

Я бы посоветовал вам переиндексировать ваш индекс в другой индекс, чтобы вы могли изменить тип вашего текстового поля на поле даты

Шаг 1: создайте index2, используя отображение index1, и обязательно измените тип вашего поле даты, которое является текстом для даты, введите

Шаг 2: Запустите переиндекс эластичного поиска и переиндексируйте все свои данные от индекса1 до индекса2. Поскольку вы изменили тип поля на тип поля даты. Elasticsearch теперь распознает это поле как дату

POST _reindex
 { 
"source":{ "index": "index1" },
 "dest": { "index": "index2" }
 }

Теперь вы можете запускать обычные запросы даты на index2

0 голосов
/ 19 февраля 2020

Как и предположил @jzzfs, идея состоит в том, чтобы добавить подполе date в поле starttime. Сначала вам нужно изменить отображение следующим образом:

PUT meetings/_mapping
{
  "properties": {
     "starttime" : {
        "type" : "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          },
          "date": {
            "type" : "date",
            "format" : "yyyy-MM-dd HH:mm:ss",
          }
        }
     }
  }
}

Когда вы закончите, вам нужно будет переиндексировать данные с помощью обновления по запросу API , чтобы заполнить поле starttime.date и index:

POST meetings/_update_by_query

Когда обновление будет завершено, вы сможете использовать подполе starttime.date в своем запросе:

{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "starttime.date": {
              "gte": "2020-01-02 12:30:00",
              "lte": "2020-01-10 12:30:00"
            }
          }
        }
      ]
    }
  }
}
0 голосов
/ 17 февраля 2020

Существуют способы синтаксического анализа текстовых полей как дат во время поиска, но накладные расходы нецелесообразны ... Однако вы можете сохранить starttime как текст по умолчанию, но сделать его мультиполем и запросить его, например, starttime.as_date.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...