У меня есть родительская / дочерняя структура на 3 уровнях. Скажем:
Компания -> Сотрудник -> Доступность
Поскольку здесь часто обновляется доступность (а также сотрудник), я предпочитаю использовать родительскую / дочернюю структуру вместо вложенных. И функция поиска работает нормально (все документы в правильных шардах).
Теперь я хочу отсортировать эти результаты. Сортировать их по метаданным компании (1-й уровень) несложно. Но мне нужно отсортировать еще и по 3-му уровню (доступности).
Мне нужен список компаний, отсортированных по:
- Расстояние от местоположения с учетом ASC
- Рейтинг DESC
- Самая быстрая доступность ASC
Например:
Компания A находится в 5 милях, имеет рейтинг 4, и скорее всего один из их сотрудников будет доступен через 20 часов. Компания B также находится в 5 милях, также имеет рейтинг 4, но скорее всего один из их сотрудников будет доступен через 5 часов.
Следовательно, результат сортировки должен быть B, A.
Я хотел бы добавить особый вес к каждому из этих данных, поэтому я начал писать агрегаты, которые позже мог бы использовать в моем скрипте custom_score.
Полная суть для создания индекса, импорта данных и поиска.
Теперь мне удалось написать запрос, который фактически возвращает результат, но корзина агрегирования доступности пуста. Однако я также получаю слишком структурированные результаты, я бы хотел их сгладить.
Сейчас возвращаюсь:
IDS компании -> IDS сотрудника -> первая доступность
Я хотел бы иметь такую агрегацию:
IDS компании -> первая доступность
Таким образом, я могу написать свой custom_score
сценарий для подсчета очков и их правильной сортировки.
Более упрощенный вопрос:
как можно сортировать / агрегировать по многоуровневым (большим) дочерним элементам и, возможно, сгладить результат.
источник
Query Failed [Failed to execute main query]]; nested: NullPointerException;
. Можете ли вы выполнить свою суть в своей локальной среде и убедиться, что это нормально? Благодаря!Ответы:
Для этого вам не нужны агрегаты:
Это критерии сортировки:
Если вы проигнорируете пункт 3, вы можете выполнить относительно простой запрос компании, например:
№3 сложен, потому что вам нужно найти доступность ( компания> сотрудник> доступность ) для каждой компании, ближайшей ко времени запроса, и использовать эту продолжительность в качестве третьего критерия сортировки.
Мы собираемся использовать
function_score
запрос на уровне внуков, чтобы определить разницу во времени между временем запроса и каждой доступностью в обращении_score
. (Затем мы будем использовать в_score
качестве третьего критерия сортировки).Чтобы связаться с внуками, нам нужно использовать
has_child
запрос внутриhas_child
запроса.Для каждой компании мы хотим, чтобы Сотрудник был доступен как можно скорее (и, конечно, как можно быстрее). Elasticsearch 2,0 даст нам
"score_mode": "min"
для подобных случаев, но в настоящее время, так как мы ограничены ,"score_mode": "max"
мы сделаем внук_score
быть взаимными из временной разницы.Итак, теперь
_score
для каждого внука ( Доступность ) будет1 / number-of-hours-until-available
(чтобы мы могли использовать максимальное обратное время, пока оно не будет доступно для каждого сотрудника, и максимальное обратное (ли?) Доступное время для сотрудника на компанию).Собирая все вместе, мы продолжаем запрашивать компанию, но используем команду company> employee> availability, чтобы сгенерировать
_score
для использования в качестве критерия сортировки # 3 :источник
_score
от времени до готовности .Вы должны проверить структуру данных R-Tree https://en.wikipedia.org/wiki/R-tree .
источник