2015-11-22 5 views
1

Моя команда владеет несколькими приборными панелями и рассматривает возможность перехода на Elasticsearch для консолидации стеков программного обеспечения. Один тип общих диаграмм, которые мы раскрываем, подобен «Каков ожидающий рабочий процесс к концу каждого дня?». Вот некоторые примеры данные:Вложенный запрос в Elasticsearch?

day workflow_id version status 
20151101 1 1 In Progress 
20151101 2 1 In Progress 
20151102 1 2 In Progress 
20151102 3 1 In Progress 
20151102 4 1 In Progress 
20151102 2 2 Completed 
20151103 1 3 Completed 
20151103 3 2 In Progress 
20151104 3 3 Completed 
20151105 4 2 Completed 

Каждый раз, когда что-то изменилось в рабочем процессе, новая запись вставляется, что может или не может изменить статус. Запись с max (version) - это самые последние данные для workflow_id.

Цель состоит в том, чтобы показать график, который показывает общее количество рабочих процессов «Выполняется» и «Завершено» в конце каждого дня. Это должно учитывать только запись, которая имеет самый большой номер версии до дня. Это может быть сделано в SQL с вложенными запросами:

with 

snapshot_dates as 
(select distinct day from workflow), 

snapshot as 
(select d.day, w.workflow_id, max(w.version) as max_version 
from snapshot_dates d, workflow w 
where d.day >= w.day 
group by d.day, w.workflow_id 
order by d.day, w.workflow_id) 

select s.day, w.status, count(1) 
from workflow w join snapshot s on w.workflow_id=s.workflow_id and w.version = s.max_version 
group by s.day, w.status 
order by s.day, w.status; 

Здесь ожидается выход из запроса:

day,status,count 
20151101,In Progress,2 
20151102,Completed,1 
20151102,In Progress,3 
20151103,Completed,2 
20151103,In Progress,2 
20151104,Completed,3 
20151104,In Progress,1 
20151105,Completed,4 

Я еще новичок в Elasticsearch и интересно, если Elasticsearch может сделать подобный запрос без использования приложения чтобы правильно определить отображение и запрос. В более общем плане, какова наилучшая практика для решения этой проблемы с использованием Elasticsearch?

+0

Вы должны использовать агрегацию в зависимости от даты. вы можете проверить https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-daterange-aggregation.html эту ссылку. – hkulekci

+0

Вы должны реверсировать свои данные в поиск elastics. Если у вас есть структурированные данные, вы можете создать сопоставление, это очень просто ваши запросы. Несколько раз запрос elasticsearch рушится, если одни и те же данные имеют другой тип. – hkulekci

+0

Трудность здесь в том, что не будет записи для каждого рабочего потока каждый день. Например, в 20151104 нет записи для идентификатора 4 рабочего потока, он должен использовать запись на 20151102, поскольку это самая обновленная версия в то время. Однако для 20151105 следует использовать запись на 20151105 с версией 2. – Jichao

ответ

0

Я попытался найти решение, используя bucket selector aggregation, но я был застрял в какой-то момент. Я обсуждал то же самое в elasticsearch forum. Ниже приводится то, что было предложено Christian Dahlqvist.

В дополнение к этому вы также указываете запись в индекс , ориентированный на рабочий процесс, с уникальным идентификатором, например. идентификатор рабочего процесса, как идентификатор документа. Если для одного и того же рабочего процесса предусмотрено несколько обновлений, каждый из них приведет к обновлению , и последнее состояние будет сохранено. Запуск агрегатов по этому индексу для поиска текущего или последнего состояния будет значительно более эффективным и масштабируемым, поскольку у вас есть только одна запись за рабочий процесс и не нужно отфильтровывать документы на основе отношений с другими документами.

В соответствии с этим предложением вы должны использовать Workflow Id как идентификатор документа при индексировании. И всякий раз, когда есть обновление для этого рабочего процесса, вы обновляете новую версию и дату, используя идентификатор рабочего процесса. Скажем, имя индекса - workflow, а тип индекса - workflow_status. Таким образом, отображение этого workflow_status типа будет следующим:

{ 
    "workflow_status": { 
     "properties": { 
      "date": { 
       "type": "date", 
       "format": "strict_date_optional_time||epoch_millis" 
      }, 
      "status": { 
       "type": "string", 
       "index": "not_analyzed" 
      }, 
      "version": { 
       "type": "long" 
      }, 
      "workFlowId": { 
       "type": "long" 
      } 
     } 
    } 
} 

Продолжайте добавлять/обновлять документы этого типа индекса, сохраняя workFlowId в качестве документа идентификатор.

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

{ 
    "per_day_workflow": { 
     "properties": { 
      "date": { 
       "type": "date", 
       "format": "strict_date_optional_time||epoch_millis" 
      },    
      "in_progress": { 
       "type": "long" 
      }, 
      "completed": { 
       "type": "long" 
      } 
     } 
    } 
} 

Этот индекс будет содержать данные за каждый день.Так что вам нужно, чтобы создать работу, которая будет работать в конце дня и выборки общего «In Progress» & «Completed» рабочий процесс от типа workflow_status индекса, используя следующий поиск агрегации:

POST http://localhost:9200/workflow/workflow_status/_search?search_type=count 

    { 
     "aggs": { 
      "per_status": { 
       "terms": { 
        "field": "status" 
       } 
      } 
     } 
    } 

ответ будет выглядеть следующим образом (I баллотировался на дату 2015-11-02 по вашим данным выборки):

{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 4, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "per_status": { 
      "doc_count_error_upper_bound": 0, 
      "sum_other_doc_count": 0, 
      "buckets": [ 
       { 
        "key": "In Progress", 
        "doc_count": 3 
       }, 
       { 
        "key": "Completed", 
        "doc_count": 1 
       } 
      ] 
     } 
    } 
} 

Из этого ответа вам нужно извлечь In Progress и Completed количество и добавить их к per_day_workflow типа индекса с сегодняшнего дня.

Теперь, когда вам нужны данные в день для вашего графика, вы можете легко получить из этого типа индекса per_day_workflow.

Смежные вопросы