# Сравнение документов внутри индекса

**URL:** <https://discuss.elastic.co/t/topic/268688>\
**Category:** Вопросы на русском языке\
**Created:** [March 29, 2021, 6:23pm UTC](https://discuss.elastic.co/t/topic/268688 "2021-03-29T18:23:40Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![frostwar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/frostwar/32/86239_2.png) [@frostwar](https://discuss.elastic.co/u/frostwar)\
**Post date:** [March 29, 2021, 6:23pm UTC](https://discuss.elastic.co/t/topic/268688/1 "2021-03-29T18:23:40Z")

</div>

Всем привет.  
В индексе есть несколько типов документов. Одни документы - Input, другие - Output.  
В каждом документе есть поле session\_ID, которое отвечает за уникальность передачи сесии.

Вопросы:

1. Как связать/сопоставить/посчитать документы с одинаковыми session\_ID?  
Потом в идеале вывести полученный результат в Grafana...

2. Делать сопоставление на стороне эластика или на стороне графаны?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 29, 2021, 6:36pm UTC](https://discuss.elastic.co/t/topic/268688/2 "2021-03-29T18:36:22Z")

</div>

Сколько документов в индексе? Как часто надо сопоставлять?

---

<div class="post-metadata">

**Author:** ![frostwar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/frostwar/32/86239_2.png) [@frostwar](https://discuss.elastic.co/u/frostwar)\
**Post date:** [March 29, 2021, 6:48pm UTC](https://discuss.elastic.co/t/topic/268688/3 "2021-03-29T18:48:09Z")

</div>

За день по 200 000. Сопоставление раз в минуту.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 29, 2021, 7:06pm UTC](https://discuss.elastic.co/t/topic/268688/4 "2021-03-29T19:06:09Z")

</div>

Тогда лучше хранить обе части в одном документе. То есть структура будет такая:

```auto
{
  "session": "session id goes here",
  "input": {
     "present": true,
     ....
   },
   "output": {
     "present": true,
     ....
   }
}

```

Так как гарантии того, что output придет после input нет, то и то и другое надо добавлять через [doc\_as\_upsert](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html#doc_as_upsert). Сопоставление становиться тривиальным, так как все части находятся в одном документе.

---

<div class="post-metadata">

**Author:** ![frostwar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/frostwar/32/86239_2.png) [@frostwar](https://discuss.elastic.co/u/frostwar)\
**Post date:** [March 29, 2021, 7:27pm UTC](https://discuss.elastic.co/t/topic/268688/5 "2021-03-29T19:27:03Z")

</div>

Грубо говоря через Logstash сделать объединение документов?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 29, 2021, 8:58pm UTC](https://discuss.elastic.co/t/topic/268688/6 "2021-03-29T20:58:12Z")

</div>

Можно и через logstash, но через elasticsearch будет надежнее.

---

<div class="post-metadata">

**Author:** ![frostwar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/frostwar/32/86239_2.png) [@frostwar](https://discuss.elastic.co/u/frostwar)\
**Post date:** [March 29, 2021, 9:17pm UTC](https://discuss.elastic.co/t/topic/268688/7 "2021-03-29T21:17:26Z")

</div>

Прошу прощения, Игорь, за свою назойливость, но могли бы вы в нескольких шагах показать неродивому уму как сие делается? Буду очень вам признателен!

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 29, 2021, 9:42pm UTC](https://discuss.elastic.co/t/topic/268688/8 "2021-03-29T21:42:59Z")

</div>

Если через logstash, то есть три метода. 1) можно вытащить документ через [elasticsearch filter](https://www.elastic.co/guide/en/logstash/current/plugins-filters-elasticsearch.html) обновить его и проиндексировать опять. Но это вариант медленный и не надежный. 2) можно воспользоваться фильтром [aggregate](https://www.elastic.co/guide/en/logstash/current/plugins-filters-aggregate.html) и формировать полный документ в logstash. Это самый быстрый вариант, но если logstash перегружается то можно потерять пары, и вы ограничены одним воркером в logstash. 3) можно индексировать как обычно, используя флаг [doc\_as\_upsert](https://www.elastic.co/guide/en/logstash/master/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-doc_as_upsert) это будет медленнее чем во втором случае и будет создавать больше нагрузки на elasticsearch, но можно при этом обрабатывать входной поток на нескольких воркерах logstash и меньше вероятности потерять события при перезагрузки logstash, особенно если использовать persistent queues.

---

<div class="post-metadata">

**Author:** ![frostwar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/frostwar/32/86239_2.png) [@frostwar](https://discuss.elastic.co/u/frostwar)\
**Post date:** [April 1, 2021, 8:28pm UTC](https://discuss.elastic.co/t/topic/268688/9 "2021-04-01T20:28:35Z")

</div>

Игорь, простите за наглость, но можно какой-нибудь "боевой пример" одного из методов? Не знаю даже с какой стороны подступиться к решению проблемы...

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [April 1, 2021, 8:37pm UTC](https://discuss.elastic.co/t/topic/268688/10 "2021-04-01T20:37:06Z")

</div>

Странно. А вы на мои ссылки нажимали? В первом пункте документации очень подробный пример, почти совпадающий с тем, что вам нужно. В 2-ом пункте 5 конкретных и очень подробных примеров покрывающие все аспекты этой проблемы. В 3-м варианте нет примеров - но это просто флаг.

---

<div class="post-metadata">

**Author:** ![frostwar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/frostwar/32/86239_2.png) [@frostwar](https://discuss.elastic.co/u/frostwar)\
**Post date:** [April 1, 2021, 8:38pm UTC](https://discuss.elastic.co/t/topic/268688/11 "2021-04-01T20:38:22Z")

</div>

Спасибо

---

<div class="post-metadata">

**Author:** ![frostwar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/frostwar/32/86239_2.png) [@frostwar](https://discuss.elastic.co/u/frostwar)\
**Post date:** [April 13, 2021, 5:16pm UTC](https://discuss.elastic.co/t/topic/268688/12 "2021-04-13T17:16:23Z")

</div>

Игорь, здравствуйте. Не могли бы вы на примере показать как это сделать? Я так понимаю, что наиболее быстрый метод из трёх, что вы описали - это второй.

У меня есть 3 типа логов:

> ```
> [#|2021-04-12T20:29:06.126+0300|INFO|testserv|somesender|_ThreadID=110;_ThreadName=thread-20;Process Instance Id=172.10.11.11:-2c25bc5:178c697e3ac:-29de;Service Assembly Name=FileReaderCA;Activity Name=InitConfig;Some Process Name=fileReader;|Flow::MainFlow::Start::SessionId=172.10.11.11:-2c25bc5:178c697e3ac:-2a8f|#]
> 
> [#|2021-04-12T20:24:19.024+0300|INFO|testserv|somesender|_ThreadID=102;_ThreadName=thread-5;Process Instance Id=172.10.11.11:-2c25bc5:178c697e3ac:-2a8c;Service Assembly Name=OutboundAdaptersCA;Activity Name=createTask;Some Process Name=Adapter;|Invoke::Task::Start::SessionId=172.10.11.11:-2c25bc5:178c697e3ac:-2a8f::Some data::pid=17749551::request=<?xml version="1.0" encoding="UTF-8"?><CreateRequest xmlns="[http://someip.ru](http://someip.ru/)"><Bic xmlns="">044525974</Bic><TaskAccount xmlns="">47422810000000000088</TaskAccount><Destination xmlns="">SysReg</Destination></CreateRequest>|#]
> 
> [#|2021-04-12T20:24:19.038+0300|INFO|testserv|somesender|_ThreadID=102;_ThreadName=thread-5;Process Instance Id=172.10.11.11:-2c25bc5:178c697e3ac:-2a8c;Service Assembly Name=OutboundAdaptersCA;Activity Name=createTask;Some Process Name=Adapter;|Invoke::Task::End::SessionId=172.10.11.11:-2c25bc5:178c697e3ac:-2a8f::Some data::RegisteredId=12383987141;errorCode=;description=|#]
> 
> ```

Данные логи это 3 различных типов запроса - жизненный цикл прохождения одной задачи на сервере. Успешность выполнения задачи - это последовательное прохождение процесса **через 3 этапа**. Если один из этапов отсутствует, то выполнение задачи считается неуспешным. Мне необходимо посчитать количество таких "успешных троек" и связать их по полю **SessionId**.

Не могли бы вы продемонстрировать как в Logstash воспользоваться фильтром aggregate для данной задачи? Все поля уже распарсены через Grok.

Какая логика будет у фильтра? Поиск всех одинаковых значений SessionId и добавление в новое поле документа или необходимо "склеивать тройки" в 1 документ/поле и считать склеенные части?

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [May 11, 2021, 5:16pm UTC](https://discuss.elastic.co/t/topic/268688/13 "2021-05-11T17:16:24Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
