Агрегация, запрос диапазона дат в Elassandra / Elastic Search - PullRequest
0 голосов
/ 02 ноября 2018

Получение разных результатов при поиске при индексации агрегации диапазона дат.

Создан индекс как показано ниже.

curl -XPUT -H 'Content-Type: application/json' 'http://x.x.x.x:9200/date_index' -d '{
  "settings" : { "keyspace" : "keyspace1"},
  "mappings" : {
    "table1" : {
      "discover":"sent_date",
      "properties" : {
        "sent_date" : { "type": "date", "format": "yyyy-MM-dd HH:mm:ssZZ" }
        }
    }
  }
}'

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

    curl -XGET -H 'Content-Type: application/json' 'http://x.x.x.x:9200/date_index/_search?pretty=true' -d '
    {
      "aggs" : {
        "sentdate_range_search" : {
          "date_range" : {
            "field" : "sent_date",
            "time_zone": "UTC",
            "format" : "yyyy-MM-dd HH:mm:ssZZ",
            "ranges" : [
              { "from" : "2010-05-07 11:22:34+0000", "to" : "2011-05-07 11:22:34+0000"}
            ]
      }
    }
  }
}'

Пример вывода, показывающий разные результаты, такие как 2039, 2024 и т. Д.

{
  "took" : 26,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 417427,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "date_index",
        "_type" : "table1",
        "_id" : "P89200822_4210021505784",
        "_score" : 1.0,
        "_source" : {
          "sent_date" : "2039-05-22T14:45:39.000Z"
        }
      },
      {
        "_index" : "date_index",
        "_type" : "table1",
        "_id" : "P89200605_4210020537428",
        "_score" : 1.0,
        "_source" : {
           "sent_date" : "2024-06-05T07:20:57.000Z"
        }
      },
      .........
    "aggregations" : {
    "sentdate_range_search" : {
      "buckets" : [
        {
          "key" : "2010-05-07 11:22:34+00:00-2011-05-07 11:22:34+00:00",
          "from" : 1.273231354E12,
          "from_as_string" : "2010-05-07 11:22:34+00:00",
          "to" : 1.304767354E12,
          "to_as_string" : "2011-05-07 11:22:34+00:00",
          "doc_count" : 0
         }
      ]
    }
  }

К вашему сведению: Я использую данные, которые находились в базе данных Cassandra, где поле «sent_date» хранится с часовым поясом UTC.

Пожалуйста, сообщите, спасибо

1 Ответ

0 голосов
/ 02 ноября 2018

== Переработанный ответ на основе разговора в комментариях ==

Агрегации отличаются от поисковых запросов. Агрегации объединяют записи (т.е. агрегируют!) По указанным измерениям. Запрос в вопросе объединяет записи, которые попадают между двумя указанными датами, в одно ведро. Более подробную информацию о агрегатах можно найти в документации Elasticsearch

Поскольку требуется фильтровать записи, которые попадают между двумя датами, подходящим подходом является фильтр диапазона дат:

GET date_index/_search
{
   "query": {
       "bool": {
           "filter": {
               "range": {
                   "sent_date": {
                       "gte": "2010-05-07 11:22:34+0000",
                       "lte": "2011-05-07 11:22:34+0000"
                   }
               }
            }
        }
    }
}

Зачем фильтровать вместо обычного запроса? Фильтры работают быстрее, чем поиск, потому что они не способствуют оценке документов и кешируются. Вы можете комбинировать фильтры и поиски, чтобы, например, получить все записи в заданном временном интервале, которые соответствуют фразе «вся работа и отсутствие игры делает Джека скучным мальчиком».

...