# Проблема поиска только что добавленных данных

**URL:** <https://discuss.elastic.co/t/topic/169202>\
**Category:** Вопросы на русском языке\
**Created:** [February 20, 2019, 12:11pm UTC](https://discuss.elastic.co/t/topic/169202 "2019-02-20T12:11:21Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 20, 2019, 12:11pm UTC](https://discuss.elastic.co/t/topic/169202/1 "2019-02-20T12:11:21Z")

</div>

В БД льются данные сразу в несколько потоков в разные индексы например в А и в Б. Поток А ищет данные в индексе Б и поток Б ищет в индексе А. Время пересоздания индекса стоит 1сек. Если в эту секунду добавить и попытаться найти данные, то БД их не найдет. Как быть в данном случае? Отключить время пересоздания? Но тогда диск будет постоянно занят и скорость добавления падает очень сильно

---

<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:** [February 20, 2019, 3:23pm UTC](https://discuss.elastic.co/t/topic/169202/2 "2019-02-20T15:23:20Z")

</div>

> [@andy4195](#):
>
> Время пересоздания индекса стоит 1сек

Что значит "пересоздание индекса"?

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 21, 2019, 7:43am UTC](https://discuss.elastic.co/t/topic/169202/3 "2019-02-21T07:43:00Z")

</div>

refresh\_interval:1s

---

<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:** [February 21, 2019, 3:21pm UTC](https://discuss.elastic.co/t/topic/169202/4 "2019-02-21T15:21:03Z")

</div>

Да, такая конструкция будет крайне не оптимальной. А зачем вы ищите? Можно узнать больше о проблеме, которую вы пытаетесь этим решить?

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 21, 2019, 3:34pm UTC](https://discuss.elastic.co/t/topic/169202/5 "2019-02-21T15:34:07Z")

</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:** [February 21, 2019, 3:46pm UTC](https://discuss.elastic.co/t/topic/169202/6 "2019-02-21T15:46:56Z")

</div>

Как происходит поиск? По id? Что происходить с записью планов, если она найдена?

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 21, 2019, 3:59pm UTC](https://discuss.elastic.co/t/topic/169202/7 "2019-02-21T15:59:45Z")

</div>

Поиск идёт по ID. Если наши, то удаение

---

<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:** [February 21, 2019, 4:55pm UTC](https://discuss.elastic.co/t/topic/169202/8 "2019-02-21T16:55:11Z")

</div>

Почему тогда не поместить все в один индекс и использовать id как id документа? В этом случае ничего искать не надо, просто индексируете закупку с тем же id, и если план уже там - он просто автоматически удалится?

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 21, 2019, 7:11pm UTC](https://discuss.elastic.co/t/topic/169202/9 "2019-02-21T19:11:02Z")

</div>

Не очень удобно.

1. У закупки ID другой чем у плана. (это конечно можно сделать единым)
2. При записи закупки необходимо найти предыдущую закупку с тем же ID но предыдущей версией и взять у неё дату её создания. Т. К. В закупках (это не наш формат) нет первой даты публикации. Её таким образом мы и получаем

---

<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:** [February 21, 2019, 7:42pm UTC](https://discuss.elastic.co/t/topic/169202/10 "2019-02-21T19:42:54Z")

</div>

> [@andy4195](#):
>
> При записи закупки необходимо найти предыдущую закупку с тем же ID но предыдущей версией и взять у неё дату её создания.

Это можно сделать через [Update API](https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docs-update.html).

Проблему с refresh можно было бы решить заменой поиска на [realtime get](https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docs-get.html#realtime). Но это только уменьшит проблемы с секунд до миллисекунд, но не устранит ее полностью так как все равно получается состояние гонки:

- поиск в A ничего не находит
- поиск в B ничего не находит
- записываем в B
- записываем в A

Поскольку в Elasticsearch нет средств синхронизации и транзакций, и атомарные операции поддерживаются только на уровне одной записи, я не знаю, как это сделать без использования одной и той же записи для планов и закупок.

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 21, 2019, 8:16pm UTC](https://discuss.elastic.co/t/topic/169202/11 "2019-02-21T20:16:32Z")

</div>

А update разве добавит запись в случае её отсутствия в индексе?

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 21, 2019, 8:19pm UTC](https://discuss.elastic.co/t/topic/169202/12 "2019-02-21T20:19:21Z")

</div>

И я так понимаю real tine ещё больше увеличит нагрузку на диски, хотя диски и так нагружены на 100%

---

<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:** [February 21, 2019, 8:43pm UTC](https://discuss.elastic.co/t/topic/169202/13 "2019-02-21T20:43:19Z")

</div>

> А update разве добавит запись в случае её отсутствия в индексе?

В режиме upsert - да

> И я так понимаю real tine ещё больше увеличит нагрузку на диски, хотя диски и так нагружены на 100%

Вы можете увеличить refresh\_interval и с отсутствием поиска нагрузка может уменьшиться. В режиме realtime elasticsearch использует список id записей, которые были проиндексированы после последнего рефреша. Этот список хранится в памяти и если запись, которую вы хотите прочитать, в этом списке, то elasticsearch выполняет автоматический рефреш.

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 21, 2019, 9:27pm UTC](https://discuss.elastic.co/t/topic/169202/14 "2019-02-21T21:27:53Z")

</div>

Спасибо большое. Будем пробовать

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 22, 2019, 8:57am UTC](https://discuss.elastic.co/t/topic/169202/15 "2019-02-22T08:57:49Z")

</div>

Я так понимаю если использовать Script, то надо в этом скрипте перечислять все поля которые надо обновлять ... Что не есть хорошо, т.к. полей много и надо в скрипте знать структуру JSon. Если бы можно было бы передавать в Update еще и документ, в который и вставлять нужные данные из \_source...

---

<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:** [February 22, 2019, 4:23pm UTC](https://discuss.elastic.co/t/topic/169202/16 "2019-02-22T16:23:38Z")

</div>

Тогда, можно прочитать старый документ через get, поменять его в вашем приложении и записать его снова используя метод описанный в [optimistic concurrency control](https://www.elastic.co/guide/en/elasticsearch/reference/current/optimistic-concurrency-control.html)

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 22, 2019, 4:46pm UTC](https://discuss.elastic.co/t/topic/169202/17 "2019-02-22T16:46:17Z")

</div>

Но если поставить refreshindex в более значение то get не найдёт же его))

---

<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:** [February 22, 2019, 4:59pm UTC](https://discuss.elastic.co/t/topic/169202/18 "2019-02-22T16:59:49Z")

</div>

Я вам вчера ссылку про realtime get прислал, Вы ее посмотрели?

> By default, the get API is realtime, and **is not affected by the refresh rate of the index** (when data will become visible for search). If a document has been updated but is not yet refreshed, the get API will issue a refresh call in-place to make the document visible. This will also make other documents changed since the last refresh visible. In order to disable realtime GET, one can set the `realtime` parameter to `false` .

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 22, 2019, 5:11pm UTC](https://discuss.elastic.co/t/topic/169202/19 "2019-02-22T17:11:02Z")

</div>

Да, точно. Спасибо. Попробую

---

<div class="post-metadata">

**Author:** ![andy4195](https://avatars.discourse-cdn.com/v4/letter/a/e68b1a/32.png) [@andy4195](https://discuss.elastic.co/u/andy4195)\
**Post date:** [February 26, 2019, 8:47am UTC](https://discuss.elastic.co/t/topic/169202/20 "2019-02-26T08:47:21Z")

</div>

Еще один вопрос, если использовать PrepareDelete, он так же будет работать как realtime ? Т.е. поищет ID в памяти и только потом уже будет искать в индексе? или сначала лучше найти с помощью realtime get?

[Next page](https://discuss.elastic.co/t/topic/169202.md?page=2)
