Объединить вложенные поля в скриптовом поле - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы создать поле со сценарием, которое проверяет два свойства вложенного поля.

У меня есть индекс ES, который содержит информацию о процессах.Процесс настроен как вложенный объект .Каждый документ может иметь более одного процесса.Также возможно иметь более одного процесса одного типа (один и тот же processDefinitionKey ).

Вот как в данный момент структурированы процессы:

"process" : {
  "type" : "nested",
  "include_in_parent" : true,
  "properties" : {
    "created" : {
      "type" : "date",
      "format" : "date_optional_time"
    },
    "ended" : {
      "type" : "date",
      "format" : "date_optional_time"
    },
    "id" : {
      "type" : "text",
      "index" : false
    },
    "processDefinitionKey" : {
      "type" : "keyword"
    },
    "processDefinitionName" : {
      "type" : "text",
      "fields" : {
        "raw" : {
          "type" : "keyword",
          "index" : false
        }
      },
      "analyzer" : "case_insensitive_sort"
    }
  }
}

Сейчас меня интересуют все активные процессы определенного вида.Таким образом, они должны иметь определенное processDefinitionKey и , а не иметь свойство ended.Я написал для него запрос ES:

{
  "query": {
    "nested": {
      "path": "process",
      "query": {
        "bool": {
          "must": {
            "match": {
              "process.processDefinitionKey": "service_agreement"
            }
          },
          "must_not": {
            "exists": {
              "field": "process.ended"
            }
          }
        }
      }
    }
  }
}

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

Однако я бы предпочел добавить это свойство «имеет активный процесс такого рода» в качестве столбца в таблице поиска, создав сценарий поля для этого.Это поле со сценарием, которое я придумал (безболезненно):

doc['process.processDefinitionKey'].contains('service_agreement') && doc['process.ended'].empty

Но результаты здесь не совпадают с запросом выше.Я боюсь, что этот скрипт проверяет, существует ли процесс с правильным процессом processDefinitionKey и a без свойства ended.Но он не проверяет, являются ли оба свойства истинными для одного и того же процесса.

Как убедиться, что в скриптовом поле проверяются свойства processDefinitionKey и ended одного и того же процесса?

Я использую Kibana 6.4.2

РЕДАКТИРОВАТЬ:

Пример документа, где поле сценария должно возвращаться true (процесс service_agreement еще не закончился,другой процесс имеет):

{
  "_index": ...,
  "_type"...,
  "_id": ...,
  "_version": ...,
  "_score": ...,
  "_source": {
    "type": ...,
    ...,
    "process": [
      {
        "id": "130707",
        "created": "2017-09-11T09:50:52.000+02:00",
        "ended": "2017-09-13T10:16:43.000+02:00",
        "processDefinitionKey": "so_ondertekenproces",
        "processDefinitionName": "Samenwerkingsovereenkomst",
        "incidents": []
      },
      {
        "id": "c2a83c07-15f7-11e7-a20e-0242ac120004",
        "created": "2017-03-31T11:52:32.000+02:00",
        "processDefinitionKey": "service_agreement",
        "processDefinitionName": "Service Agreement",
        "incidents": []
      }
    ]
  },
  "fields": {
    "process.created": [
      "2017-03-31T09:52:32.000Z",
      "2017-09-11T07:50:52.000Z"
    ],
    "process.ended": [
      "2017-09-13T08:16:43.000Z"
    ]
  }
}

Пример документа, в котором поле сценария должно возвращать false:

{
  "_index": ...,
  "_type": ...,
  "_id": ...,
  "_score": ...,
  "_source": {
    "type": ...,
    ...,
    "process": [
      {
        "id": "17154",
        "created": "2017-05-24T13:21:40.000+02:00",
        "ended": "2017-05-24T13:23:24.000+02:00",
        "processDefinitionKey": "so_ondertekenproces",
        "processDefinitionName": "Samenwerkingsovereenkomst",
        "incidents": []
      },
      {
        "id": "17263",
        "created": "2017-05-24T13:23:29.000+02:00",
        "ended": "2017-09-27T14:31:00.000+02:00",
        "processDefinitionKey": "so_ondertekenproces",
        "processDefinitionName": "Samenwerkingsovereenkomst",
        "incidents": []
      },
      {
        "id": "f1cd056e-15f7-11e7-a20e-0242ac120004",
        "created": "2017-03-31T11:53:51.000+02:00",
        "ended": "2017-10-10T11:35:47.000+02:00",
        "processDefinitionKey": "service_agreement",
        "processDefinitionName": "Service Agreement",
        "incidents": []
      }
    ]
  },
  "fields": {
    "process.created": [
      "2017-03-31T09:53:51.000Z",
      "2017-05-24T11:21:40.000Z",
      "2017-05-24T11:23:29.000Z"
    ],
    "process.ended": [
      "2017-05-24T11:23:24.000Z",
      "2017-09-27T12:31:00.000Z",
      "2017-10-10T09:35:47.000Z"
    ]
  }
}

1 Ответ

0 голосов
/ 20 декабря 2018

Здесь вы имеете дело с вложенными документами.Поэтому вам нужно перебрать вложенные документы и оценить, соответствует ли требуемое условие или нет.Это может быть достигнуто с помощью следующего сценария:

ОБНОВЛЕНО Ответ:

boolean res = false;
for(int i = 0; i < params['_source']['process'].length; i++) {
   if(params['_source']['process'][i]['processDefinitionKey'] == 'service_agreement' && !params['_source']['process'][i].containsKey('ended')) {
      res = true;
      break;
   }
}
return res;

Сценарий в одну строку:

boolean res = false; for(int i = 0; i < params['_source']['process'].length; i++){ if(params['_source']['process'][i]['processDefinitionKey'] == 'service_agreement' && !params['_source']['process'][i].containsKey('ended')) { res = true; break; }} return res;

Поле сценариябудет иметь тип boolean.

Надеюсь, это поможет!

...