Как выполнить операцию JOIN в elasticsearch

Как выполнить операцию JOIN в elasticsearch по тому же индексу?

Это набор полей для каждого документа:

      "@version": "1",
      "@timestamp": "2016-04-26T15:56:05.379Z",
      "phone": "..."
      "path": "...",
      "host": "...",
      "type": "...",
      "clientip": "...",
      "ident": "-",
      "auth": "-",
      "timestamp": "...",
      "verb": "...",
      "uripath": "...",
      "httpversion": "1.1",
      "response": "200",
      "bytes": "515",
      "timetaken": "383",
      "event_type": "type1"
    }

Если бы я хотел получить телефон документов, которые имеют (event_type из type1, метку времени между date1 и date2) и (event_type из type2, отметка времени между date3 и дата4)

В mysql мышление было бы объединением двух представлений


person M_M    schedule 06.07.2016    source источник
comment
В документах говорится, что здесь можно использовать функцию dis_max. Вы сталкивались с этим?   -  person Peter Branforn    schedule 06.07.2016
comment
Возможный дубликат запроса на присоединение в ElasticSearch   -  person Mišo    schedule 01.05.2019


Ответы (1)


Возможно, я не самый оптимизированный запрос, но это сработало:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "range": {
                      "timestamp ": {
                        "lte": date1,
                        "gte": date2
                      }
                    }
                  },
                  {
                    "term": {
                      "event_type ": "type1"
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "range": {
                      "timestamp ": {
                        "lte": date3,
                        "gte": date4
                      }
                    }
                  },
                  {
                    "term": {
                      "event_type ": "type2"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

Он вернет все документы, которые имеют event_type типа 1, временную метку между date1 и date2, и все документы, которые имеют event_type типа 2, временную метку между date3 и date4.

bool should вернет все документы, относящиеся к любой его части.

person baudsp    schedule 06.07.2016
comment
Это похоже на (тип_события типа 1, отметка времени между датой 1 и датой 2) ИЛИ (тип_события типа 2, метка времени между датой 3 и датой 4) - person M_M; 11.07.2016
comment
@M_M Я добавлю подробности, но если вы проверили это, я хотел бы получить подробности. - person baudsp; 11.07.2016
comment
@M_M Да, это документы, которые имеют (event_type типа 1, временную метку между датой 1 и датой 2) ИЛИ (event_type типа 2, временную метку между датой 3 и датой 4), но с И у вас не будет никаких результатов, не так ли? - person baudsp; 11.07.2016
comment
Если их выполняет один и тот же пользователь? это похоже на то, что вы хотите добавить, где близко, что-то вроде этого - person M_M; 15.07.2016
comment
@M_M Я почти уверен, что это невозможно с ES. - person baudsp; 17.07.2016