Программирование

Как можно объединить два Dataviews в Elastic 8.17.3 с помощью LOOKUP JOIN в ES|QL?

У меня есть Dataview `k8s-ss-*` в Kibana space 1 и временный Dataview `akamai` в Kibana space 2. Я хочу объединить их по общему полю `client.ip` из `k8s-ss-*` и `Cliip` из `akamai`, но при выполнении запроса получаю ошибку парсинга. Какой правильный синтаксис или подход для выполнения этого объединения через Dataviews в разных Kibana spaces?

Как объединить два dataview в Elastic 8.17.3 с помощью LOOKUP JOIN в ES|QL?
У меня есть dataview k8s-ss-* в пространстве Kibana 1 и временный dataview akamai в пространстве Kibana 2. Я хочу соединить их по общему полю client.ip из k8s-ss-* и Cliip из akamai, но при выполнении запроса:

FROM k8s-ss-*
| LOOKUP JOIN akamai ON k8s-ss-*.client.ip = akamai.Cliip

получаю ошибку парсинга. Какой правильный синтаксис или подход, чтобы выполнить такой JOIN между dataviews, находящимися в разных пространствах Kibana?

Проблема с парсингом возникла по двум причинам:

  1. Ссылки на поля – в ES|QL имена полей не префиксируются именем индекса/дата‑вью.
  2. Синтаксис кросс‑пространственного поиска – целевой дата‑вью нужно заключить в кавычки, а если он находится в другом пространстве, то добавить префикс‑ID этого пространства.

Правильный синтаксис

sql
FROM dataview "k8s-ss-*" AS k
| LOOKUP JOIN dataview "space2:akamai" AS a
  ON k.client.ip = a.Cliip

или без ключевого слова dataview (полностью эквивалентно):

sql
FROM "k8s-ss-*" AS k
| LOOKUP JOIN "space2:akamai" AS a
  ON k.client.ip = a.Cliip

Важно:

  • k.client.ip и a.Cliip – это только имена полей.
  • Второй аргумент (space2:akamai) – полное имя дата‑вью в другом пространстве.
  • Алиасы (AS k, AS a) опциональны, но делают запрос более читаемым.

Почему исходный запрос не сработал

  • k8s-ss-*.client.ip воспринимается как недопустимый путь к полю.
  • akamai без префикса пространства считается дата‑вью в текущем пространстве, поэтому парсер ожидает иной синтаксис.

Как включить кросс‑пространственные соединения

  1. Кросс‑пространственный поиск должен быть включён в Kibana (kibana.crossSpaceSearch.enabled: true).
  2. Пользователь, выполняющий запрос, должен иметь права чтения в обоих пространствах.
  3. Если хочется явно указать пространство источника, можно написать FROM "space1:k8s-ss-*", но это не требуется при использовании дата‑вью.

Полный пример с алиасами и комментариями

sql
/* Дата‑вью источника из пространства 1 */
FROM dataview "k8s-ss-*" AS k

/* Дата‑вью для lookup из пространства 2 */
| LOOKUP JOIN dataview "space2:akamai" AS a

/* Соединяем по общему полю IP */
  ON k.client.ip = a.Cliip

Запустив этот запрос в Dev Tools > ES|QL Kibana, вы получите объединённые строки, где IP из k8s-ss-* совпадает со значением Cliip в akamai.


Итоги

  • В ON‑условии используйте только имена полей.
  • Указывайте пространство целевого дата‑вью (space2:akamai).
  • Убедитесь, что кросс‑пространственный поиск включён и у пользователя есть права доступа.
  • Алиасы (AS k, AS a) не обязательны, но повышают читаемость.

С этими поправками соединение между дата‑вью в разных Kibana‑пространствах будет работать корректно в Elastic 8.17.3.

Авторы
Проверено модерацией
Модерация