Разница во времени запроса Elasticsearch между внутренними объектами - PullRequest
5 голосов
/ 17 февраля 2020

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

Возьмем этот единственный документ, например:

{
  "messages": [
    [
      {
        "message": "First message",
        "timeStamp": "0:00:00"
      },
      {
        "message": "Second message",
        "timeStamp": "0:10:00"
      },
      {
        "message": "Third message",
        "timeStamp": "0:15:00"
      },
      {
        "message": "Fourth message",
        "timeStamp": "0:30:00"
      },
      {
        "message": "Fifth message",
        "timeStamp": "1:00:00"
      }
    ]
  ]
}

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

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "path": "messages",
                  "query": {
                    "bool": {
                      "must": [
                        {
                          "match": {
                            "messages.message": "Second"
                          }
                        },
                        {
                          "match": {
                            "messages.timeStamp": "0:10:00"  <-- Start timeStamp depends on my data, consider this as a variable X to be used below
                          }
                        }
                      ]
                    }
                  }
                }
              },
              {
                "nested": {
                  "path": "messages",
                  "query": {
                    "bool": {
                      "must": [
                        {
                          "match": {
                            "messages.message": "Third"
                          }
                        },
                        {
                          "range": {
                            "messages.timeStamp": {
                              "gte": "0:10:00", <-- Variable X mentioned above
                              "lte": "0:15:00"  <-- I can't know end timeStamp, can only know it's a 5 minute range
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Я исследовал использование результата как части подзапроса, старые ответы в предыдущих версиях говорят, что это невозможно, и не смогли выполнить его с помощью script_fields или inner_hits Я также рассмотрел запрос пространственных объектов, но похоже, что мне все равно нужно указать источник в качестве части запроса, и я не уверен, что это на самом деле решает мою проблему.

Кто-нибудь знает, есть ли реальный способ достичь этого ?? Спасибо!

...