2014-10-31 3 views
1

Я делаю вложенную агрегацию в год, а затем каждую неделю каждый год в elasticsearch. Високосные годы имеют 53 недели, но результат ElasticSearch дает последнюю неделю ключа високосного года = «1», а не «53». Как я могу заставить ElasticSearch возвращать 53 вместо 1 за последнюю неделю?Високосный год и скопления в неделю в ElasticSearch

Вот мой запрос:

GET _search 
    { 
    "size": 0, 
    "aggs": { 
    "activities_per_year": { 
     "date_histogram": { 
     "field": "start", 
     "interval": "1y", 
     "format": "yyyy" 
     }, 
     "aggs": { 
     "activities_per_week": { 
      "date_histogram": { 
      "field": "start", 
      "interval": "week", 
      "format": "w" 
      } 
     } 
     } 
    } 
    } 
} 

И результат (удаленные данные в середине):

"key_as_string": "2008", 
      "key": 1199145600000, 
      "doc_count": 872, 
      "activities_per_week": { 
       "buckets": [ 
       { 
        "key_as_string": "1", 
        "key": 1199059200000, 
        "doc_count": 6 
       }, 
       { 
        "key_as_string": "2", 
        "key": 1199664000000, 
        "doc_count": 5 
       }, 
       { 
        "key_as_string": "3", 
        "key": 1200268800000, 
        "doc_count": 15 
       },  { 
        "key_as_string": "51", 
        "key": 1229299200000, 
        "doc_count": 18 
       }, 
       { 
        "key_as_string": "52", 
        "key": 1229904000000, 
        "doc_count": 7 
       }, 
       { 
        "key_as_string": "1", 
        "key": 1230508800000, 
        "doc_count": 1 
       } 
       ] 

2008 високосный год, а на прошлой неделе "key_as_string": " 1" . Я хочу, чтобы это было 53, поэтому я могу добавить его в свой словарь :) Как я могу это сделать?

Кроме того, elasticsearch возвращает две недели с «key_as_string»: «1» на 2013 год, и я не думаю, что 2013 год - високосный год?

ответ

1

У этого есть некоторые тонкие ошибки, о которых нужно знать. Прежде всего, Elasticsearch использует Joda Time API для материалов, связанных с датой.

Во-вторых, посмотрите на this объяснение того, что на самом деле является «неделя»:

базирующийся неделя год один, где даты выражены как день недели, номер недели и год (неделя исходя из). Нижеследующее описание относится к стандарту ISO8601 , используемому при реализации этого метода в этой библиотеке .

Недельный период от 1 до 52-53 в неделю. Первый день недели определяется как понедельник и присваивается значение 1.

Первая неделя года определяется как первая неделя, которая имеет значение наименьших четырех дней в году. В результате этого определения неделя 1 может распространяться на предыдущий год, а неделя 52/53 может распространяться на в следующем году. Отсюда необходимость в году недели.

Например, 2003-01-01 был в среду. Это означает, что пять дней, Среда по воскресенье, этой недели - в 2003 году. Таким образом, вся неделя считается первой неделей 2003 года. Поскольку все недели начинаются с Понедельник, первая неделя 2003 года началась в 2002 году, 12-30, т.е. в 2002 году.

Недельный год имеет конкретный текстовый формат. 2002-12-30 (понедельник 30 декабря 2002 года) будет представлен в качестве документа 2003-W01-1. 2003-01-01 (среда 1 января 2003 года) будет представлен как 2003-W01-3.

Итак, в вашем случае вы видите 29-12-2008 как принадлежащий к 1-й неделе, потому что 29 декабря 2008 года проходит через неделю с тремя днями в 2008 году и четырьмя днями в 2009 году. Согласно вышеизложенному правилу , это неделя № 1 от 2009 года. И это не имеет ничего общего с високосными годами. Чтобы привести пример, попробуйте индексировать 31-12-2009 и 31-12-2015. Оба дадут вам неделю 53, и они не високосные годы.

Чтобы увидеть эти вещи лучше я предлагаю следующий формат для агрегации: "format": "x-w---yyyy-MM-dd":

{ 
    "size": 0, 
    "aggs": { 
    "activities_per_year": { 
     "date_histogram": { 
     "field": "start", 
     "interval": "1y", 
     "format": "yyyy" 
     }, 
     "aggs": { 
     "activities_per_week": { 
      "date_histogram": { 
      "field": "start", 
      "interval": "week", 
      "format": "x-w---yyyy-MM-dd" 
      } 
     } 
     } 
    } 
    } 
} 
+0

Спасибо за отличные объяснения :-) Но почему не Elasticsearch «отфильтровывать» дату с 2009 года, когда моя первая агрегация имеет интервал: 1y? Я думал, что мой подагрегированный «activity_per_week» получил его от документов, соответствующих «activity_per_year» -агрегации? – Thomas

+0

Это хороший вопрос. На данный момент у меня нет ответа. –