Попытка связать документы в разных индексах по полю


(Stanislav K.) #1

Здравствуйте, коллеги.
Представьте ситуацию когда есть три лог-файла (три индекса) которые импортируются в ES с использованием LS. Каждый лог-файл пишет независимое приложение. Лог-файлы представляют запись всех входящих и исходящих запросов в/из данного приложения. При каждом запросе создается уникальный идентификатор, однозначно указывающий на транзакцию. Но этот идентификатор валиден только для приложений, взаимодействующих между собой: т.е. в логах 1 и 2, и в логах 2 и 3. ИДентификатор из приложения/лога 1 никогда не появится в приложении/логе 3. А вся транзакция проходит через все три приложения (но как вы уже поняли сквозного идентификатора нет).

Есть задача: показать все записи из всех логов по одной транзакции. Если перевести это на язык SQL-запроса то все сводиться к возможности использования конструкции INNER JOIN.
Я понимаю, что прямого аналога в ES нет и видел множество вопросов подобного рода на форуме... мой вопрос скорее риторический. Хочется понимать "смотрят" ли разработчики на такой функционал в следующих версиях и как люди решают подобные задачи сейчас? (понятно, что такую логику можно реализовать на клиентском приложении)

P.S. Вопрос возник после того как был проведен пилот с использованием ПО SPLUNK. Там такое мапирование есть :frowning:


(Igor Motov) #2

Судя по вашему описанию, все 3 лога можно связать как дочерние документы, если для лога 1 использовать идентификатор из приложения, как идентификатор записи; во втором логе в качестве идентификатора записи использовать идентификатор второго приложения, а в качестве родителя - идентификатор первого приложения; в 3 логе идентификатор второго приложения можно использовать и как идентификатор родителя так и идентификатор записи.


(Stanislav K.) #3

Приветствую, Игорь

Я не до конца понял ваше предложение про связь через дочерние документы. Позвольте я приведу простой пример. Есть три лог-файла от трех разных программ:


лог приложения 1
10.03.2016 16:00:00 user=ivanov transaction1=101 info1=разная информация

лог приложения 2
10.03.2016 16:00:10 transaction2=101 id2=abc-200-xyz info2=другая информация

лог приложения 3
10.03.2016 16:00:20 id3=abc-200-xyz info3=совсем другая информация


Есть потребность осуществлять поиск по полю user Т.е. при поиске ivanov выводился текст другая информация и совсем другая информация из логов приложения 2 и 3 (поля info2 и info3 соответственно). Линковка этих строк может быть произведена по следующим полям: transaction1=transaction2 и id2=id3.

Можете уточнить, используя данный пример, какую технологию можно применить для облегчения поиска?

P.S. Все логи содержат большое кол-во различных строк. Не все строки лог-файла приложения 1 имеют "продолжение" в лог-файле приложения 2. А так же сам лог приложения 2 имеет записи которые никак не связаны с другими записями логов - т.е. сам по себе самодостаточен и не является лишь продолжением операций в приложении 1.


(Igor Motov) #4

Да, в этом случае, хорошего решения пока нет. Для распределенной системы, как elasticsearch, JOIN - проблема очень сложная.


(system) #5