Есть поле типа 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" ]
Что я делаю не так?
Где этот скрипт вызывается?
Экспериментирую в "script_fields".
Но, в конце концов дожен попасть в "agg" -> "terms" -> "script".
...
"script_fields":{
"shortpath": {
"script": {
"source":"ArrayList l1 = new ArrayList(doc['path'].toArray());return l1",
"params":{
"roots":["7"]
}
}
}
}
...
doc['path']
вытаскивает результаты из doc values, в которых порядок значений уже потерян. Если порядок важен - надо вытаскивать из _source.
Как в этом убедиться?
Наверное это будет сильно медленее.
Чтением документации, или анализом кода.
Да, будет медленнее.
Какой максимальный размер массива и что вы потом собрались с этими значениями делать?
Что то не вижу где сказано, что порядок элементов в массиве не гарантируется.
Наверное от 1 до 30. Но документов много. Потом агрегировать, что бы понят сколько документов к какой подгруппе относятся. Поэтому важен порядок следования.
Как подгруппа определяется? Порядок важен, а позиция не важна?
Думаю что важна, т.к. при запросе я говорю "все документы вот в этом подразделе".
Т.е. это может быть и цифра "4" и цифра "7" из примера выше.
Важно ли, что цифра 4 стоит на позиции 4, и 7 - на позиции 5. Как определяется подраздел?
Не, условно там могут присвоить любую другую цифру или UUID потом составить из этого какую то иерархию. У документа получается последовательность.
Например.
doc1:1,2,3
doc2:1,2,4
doc3:1,5,6.
Если при поиске надо найти например, в узле 2. Нашли фильтром эти документы. А в агрегачии их что их 2. Сответвенно иерархие может ветвится.
Хорошо, я понял что это иерархический ключ. Что такое узел 2?
А если у вас документы
doc3: 3,2,1 - этот документ будет появиться в поиске?
doc4: 2,1,3 - такое возможно или 2 может быть только на втором месте?
Нет. 1 это какой то корень.
Допустим:
1 - фотобумага.
2 - глянцевая фотобумага
5 - матовая фотобумага
3 - глянцевая фотобумага 10х15
4 - глянцевая фотобумага 20х15
Ищем в цзле 2 "глянцевая фотобумага 10х15", находим в самом верху , то что ищем doc3, далее менее релевантныt doc4 и имя узла "глянцевая фотобумага". И в агрегации, что всего в этом узле 3 совпадения.
Может быть более сложная струкрута, тогда их надобудет сгруппировать.
Тогда может иметь смысл хранить это по уровням - level1, level2, level3 и т.д.
Тоже не очень. Один документ может находиться в разных независимых иерархиях.
Если честно, я все-равно не понимаю что вы пытаетесь делать с этими данными и все мои попытки "выудить" эту информацию из вас отнимают слишком много времени. Если вы можете описать проблему полностью с примерами данных и операциями, которые вы с этими данными собираетесь проводить, я мог бы что-то подсказать, но продолжать дискуссию в данном режиме, у меня, к сожалению, времени сейчас нет.
Да вроде суть-то очевидна. Есть туева хуча (облако) документов. Каждый клиент может "шарить" свой документ другому клиенту. Т.к. каждый клиент волен из документов организовывать свою иерархию. (Например, своя копия "мои документы" ) у каждого клиента стоя иерархия документов. Поэтому у одного документа может быть несколько иерархий.
Задача в том, чтобы клинет искал не во всем облаке, а только в тех данных, что ему доступны. А во вторых, дать ему возможность делать поиск в конкретных своих поддиректориях. И показывать количество найденых докуаментов в какиз то поддиректориях.
Идея была в том, что в документе хранится для каждого клиента свой массив UUID-ов описывающий его иерархию. Последовательность ["40","1","11","4","7","10"]
уникальная во всем облаке описывающая иерархию конкретного клинета. Т.е. 40, 1, 11...
это уникальные UUIDы в всем наборе документов.
это уникальные UUIDы в всем наборе документов.
То есть 40, 1, 11, 4 и т.д. - это уникальные UUID вложенных директорий? И если 40 - это моя корневая директория и 1 - это поддиректория в ней, то больше ни у кого в системе не может быть директорий с такими UUID?
И показывать количество найденых докуаментов в какиз то поддиректориях.
То есть если я ищу в ["40", "1"]
туда должны входить документы из ["40", "1", "11", "4"]
?
Да. Это всё не переекающиеся ни у одного пользователя уникальные UUID-ы.
Т.е. UUID "3" замапленное "Мои документы" у одного ползователя не может пересечся с "75" замаппленное "Мои документы" у другого пользователя.