Как запросить нулевую дату внутри массива вasticsearch? - PullRequest
0 голосов
/ 15 ноября 2018

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

Мне известно о том, что для поля dateCompleted нужно указать null_value и установить для него произвольную старую дату, ноэто кажется мне хакерским.

Я пытался использовать запросы Bool с must exist doc.approvalNotifications and must not exist doc.approvalNotifications.dateCompleted, но это не работает, если документ содержит сочетание полных и ожидающих утверждения уведомлений.например, он возвращает только документ с идентификатором 2 ниже.Я ожидаю, что будут найдены документы с идентификаторами 1 и 2.

Как найти ожидающие уведомления об утверждении с использованиемasticsearch?

PUT my_index / _mapping / Document

 "properties" : {
  "doc" : {
    "properties" : {
      "approvalNotifications" : {
        "properties" : {
          "approvalBatchId" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "approvalTransitionState" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "approvedByUser" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "dateCompleted" : {
            "type" : "date"
          }
        }
      }
    }
  }
}

Документы:

{
    "id": 1,
    "status": "Pending Notifications",
    "approvalNotifications": [
        {
            "approvalBatchId": "e6c39194-5475-4168-9729-8ddcf46cf9ab",
            "dateCompleted": "2018-11-15T16:09:15.346+0000"
        },
        {
            "approvalBatchId": "05eaeb5d-d802-4a28-b699-5e593a59d445",
        }
    ]
}

{
    "id": 2,
    "status": "Pending Notifications",
    "approvalNotifications": [
        {
            "approvalBatchId": "e6c39194-5475-4168-9729-8ddcf46cf9ab",
        }
    ]
}

{
    "id": 3,
    "status": "Complete",
    "approvalNotifications": [
        {
            "approvalBatchId": "e6c39194-5475-4168-9729-8ddcf46cf9ab",
            "dateCompleted": "2018-11-15T16:09:15.346+0000"
        },
        {
            "approvalBatchId": "05eaeb5d-d802-4a28-b699-5e593a59d445",
            "dateCompleted": "2018-11-16T16:09:15.346+0000"            
        }
    ]
}

{
    "id": 4
    "status": "No Notifications"
}

1 Ответ

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

Вы почти на месте, вы можете достичь желаемого поведения, используя nested тип данных для поля "approvalNotifications".

В результате Elasticsearch выравнивает ваши approvalNotifications объекты, обрабатывая их подполя как подполя исходного документа. Вместо этого поле nested скажет ES индексировать каждый внутренний объект как неявный отдельный объект, хотя и связанный с исходным.

Для запроса nested объектов необходимо использовать nested query .

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

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