# Упорядоченный список в painless

**URL:** <https://discuss.elastic.co/t/painless/270125>\
**Category:** Вопросы на русском языке\
**Created:** [April 14, 2021, 2:33pm UTC](https://discuss.elastic.co/t/painless/270125 "2021-04-14T14:33:56Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 2:33pm UTC](https://discuss.elastic.co/t/painless/270125/1 "2021-04-14T14:33:56Z")

</div>

Есть поле типа `keyword`. Там хранится массив.  
`["40","1","11","4","7","10"]`  
В скрипте хочу выдрать часть массива начиная с какого то элемента. Но, до этого не доходит, т.к. когда я хочу получить ArrayList меняется сортировка.  
`ArrayList l1 = new ArrayList(doc['path']);return l1`  
Получаю:  
` ["1", "10", "11", "4", "40", "7"]`  
Т.е. явно отсортировано "по алфавиту". Если, например делаю так:  
`ArrayList l1 = new ArrayList([\"40\",\"1\",\"11\",\"4\",\"7\",\"10\"]);return l1`  
Получаю правильную последоваиельность:  
`["40", "1", "11", "4", "7", "10"]`  
Что я делаю не так?

---

<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 14, 2021, 3:04pm UTC](https://discuss.elastic.co/t/painless/270125/2 "2021-04-14T15:04:19Z")

</div>

Где этот скрипт вызывается?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 4:53pm UTC](https://discuss.elastic.co/t/painless/270125/3 "2021-04-14T16:53:05Z")

</div>

Экспериментирую в "script\_fields".  
Но, в конце концов дожен попасть в "agg" -\> "terms" -\> "script".

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 6:33pm UTC](https://discuss.elastic.co/t/painless/270125/4 "2021-04-14T18:33:01Z")

</div>

```auto
...
  "script_fields":{
    "shortpath": {
      "script": {
        "source":"ArrayList l1 = new ArrayList(doc['path'].toArray());return l1",
        "params":{
          "roots":["7"]
        }
      }
    }
  }
...

```

---

<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 14, 2021, 6:36pm UTC](https://discuss.elastic.co/t/painless/270125/5 "2021-04-14T18:36:34Z")

</div>

`doc['path']` вытаскивает результаты из doc values, в которых порядок значений уже потерян. Если порядок важен - надо вытаскивать из [\_source](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-fields.html#modules-scripting-source).

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 6:55pm UTC](https://discuss.elastic.co/t/painless/270125/6 "2021-04-14T18:55:45Z")

</div>

> [@Igor\_Motov](#):
>
> `doc['path']` вытаскивает результаты из doc values, в которых порядок значений уже потерян.

Как в этом убедиться?

> [@Igor\_Motov](#):
>
> Если порядок важен - надо вытаскивать из [\_source](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-fields.html#modules-scripting-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:** [April 14, 2021, 7:04pm UTC](https://discuss.elastic.co/t/painless/270125/7 "2021-04-14T19:04:34Z")

</div>

> [@GreenX](#):
>
> Как в этом убедиться?

Чтением [документации](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-fields.html#modules-scripting-doc-vals), или анализом кода.

> [@GreenX](#):
>
> Наверное это будет сильно медленее.

Да, будет медленнее.

Какой максимальный размер массива и что вы потом собрались с этими значениями делать?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 7:17pm UTC](https://discuss.elastic.co/t/painless/270125/8 "2021-04-14T19:17:42Z")

</div>

> [@Igor\_Motov](#):
>
> Чтением [документации](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-fields.html#modules-scripting-doc-vals), или анализом кода.

Что то не вижу где сказано, что порядок элементов в массиве не гарантируется.

> [@Igor\_Motov](#):
>
> Какой максимальный размер массива и что вы потом собрались с этими значениями делать?

Наверное от 1 до 30. Но документов много. Потом агрегировать, что бы понят сколько документов к какой подгруппе относятся. Поэтому важен порядок следования.

---

<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 14, 2021, 7:26pm UTC](https://discuss.elastic.co/t/painless/270125/9 "2021-04-14T19:26:19Z")

</div>

> [@GreenX](#):
>
> Потом агрегировать, что бы понят сколько документов к какой подгруппе относятся. Поэтому важен порядок следования.

Как подгруппа определяется? Порядок важен, а позиция не важна?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 7:32pm UTC](https://discuss.elastic.co/t/painless/270125/10 "2021-04-14T19:32:09Z")

</div>

Думаю что важна, т.к. при запросе я говорю "все документы вот в этом подразделе".  
Т.е. это может быть и цифра "4" и цифра "7" из примера выше.

---

<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 14, 2021, 8:04pm UTC](https://discuss.elastic.co/t/painless/270125/11 "2021-04-14T20:04:17Z")

</div>

Важно ли, что цифра 4 стоит на позиции 4, и 7 - на позиции 5. Как определяется подраздел?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 8:17pm UTC](https://discuss.elastic.co/t/painless/270125/12 "2021-04-14T20:17:34Z")

</div>

Не, условно там могут присвоить любую другую цифру или UUID потом составить из этого какую то иерархию. У документа получается последовательность.  
Например.  
doc1:1,2,3  
doc2:1,2,4  
doc3:1,5,6.  
Если при поиске надо найти например, в узле 2. Нашли фильтром эти документы. А в агрегачии их что их 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:** [April 14, 2021, 8:33pm UTC](https://discuss.elastic.co/t/painless/270125/13 "2021-04-14T20:33:26Z")

</div>

Хорошо, я понял что это иерархический ключ. Что такое узел 2?

А если у вас документы

doc3: 3,2,1 - этот документ будет появиться в поиске?

doc4: 2,1,3 - такое возможно или 2 может быть только на втором месте?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 14, 2021, 9:08pm UTC](https://discuss.elastic.co/t/painless/270125/14 "2021-04-14T21:08:21Z")

</div>

Нет. 1 это какой то корень.  
Допустим:  
1 - фотобумага.  
2 - глянцевая фотобумага  
5 - матовая фотобумага  
3 - глянцевая фотобумага 10х15  
4 - глянцевая фотобумага 20х15

Ищем в цзле 2 "глянцевая фотобумага 10х15", находим в самом верху , то что ищем **doc3** , далее менее релевантныt **doc4** и имя узла "глянцевая фотобумага". И в агрегации, что всего в этом узле 3 совпадения.  
Может быть более сложная струкрута, тогда их надобудет сгруппировать.

---

<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 14, 2021, 9:37pm UTC](https://discuss.elastic.co/t/painless/270125/15 "2021-04-14T21:37:01Z")

</div>

Тогда может иметь смысл хранить это по уровням - level1, level2, level3 и т.д.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 15, 2021, 5:56am UTC](https://discuss.elastic.co/t/painless/270125/16 "2021-04-15T05:56:01Z")

</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 15, 2021, 4:03pm UTC](https://discuss.elastic.co/t/painless/270125/17 "2021-04-15T16:03:38Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 15, 2021, 8:12pm UTC](https://discuss.elastic.co/t/painless/270125/18 "2021-04-15T20:12:04Z")

</div>

Да вроде суть-то очевидна. Есть туева хуча (облако) документов. Каждый клиент может "шарить" свой документ другому клиенту. Т.к. каждый клиент волен из документов организовывать свою иерархию. (Например, своя копия "мои документы" ) у каждого клиента стоя иерархия документов. Поэтому у одного документа может быть несколько иерархий.

Задача в том, чтобы клинет искал не во всем облаке, а только в тех данных, что ему доступны. А во вторых, дать ему возможность делать поиск в конкретных своих поддиректориях. И показывать количество найденых докуаментов в какиз то поддиректориях.

Идея была в том, что в документе хранится для каждого клиента свой массив UUID-ов описывающий его иерархию. Последовательность `["40","1","11","4","7","10"]` уникальная во всем облаке описывающая иерархию конкретного клинета. Т.е. `40, 1, 11...` это уникальные UUIDы в всем наборе документов.

---

<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 15, 2021, 8:29pm UTC](https://discuss.elastic.co/t/painless/270125/19 "2021-04-15T20:29:47Z")

</div>

> это уникальные UUIDы в всем наборе документов.

То есть 40, 1, 11, 4 и т.д. - это уникальные UUID вложенных директорий? И если 40 - это моя корневая директория и 1 - это поддиректория в ней, то больше ни у кого в системе не может быть директорий с такими UUID?

> И показывать количество найденых докуаментов в какиз то поддиректориях.

То есть если я ищу в `["40", "1"]` туда должны входить документы из `["40", "1", "11", "4"]`?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 15, 2021, 8:39pm UTC](https://discuss.elastic.co/t/painless/270125/20 "2021-04-15T20:39:40Z")

</div>

> [@Igor\_Motov](#):
>
> То есть 40, 1, 11, 4 и т.д. - это уникальные UUID вложенных директорий?

Да. Это всё не переекающиеся ни у одного пользователя уникальные UUID-ы.  
Т.е. UUID "3" замапленное "Мои документы" у одного ползователя не может пересечся с "75" замаппленное "Мои документы" у другого пользователя.

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