Статьи

Сортировка по значению функции в Solr

В Solr 3.1 и позже у нас есть очень интересная функциональность, которая позволяет нам сортировать по значению функции. Что это дает нам? Собственно, несколько интересных возможностей.

Давайте начнем

Первый пример, который приходит на ум, возможно, из-за проекта, над которым я работал некоторое время назад, это сортировка по расстоянию между двумя географическими точками. До настоящего времени для реализации такой функциональности были необходимы изменения в Solr (например, LocalSolr или  LocalLucene ). Используя Solr 3.1 и более поздние версии, вы можете сортировать результаты поиска, используя значение, возвращаемое определенными функциями. Например, это Solr, у нас есть функция dist, вычисляющая расстояние между двумя точками. Одним из вариантов функции является функция, принимающая пять параметров: алгоритм и две пары точек. Если, используя эту функцию, мы хотим отсортировать результаты поиска в порядке возрастания от точки широты и долготы 0.0, мы должны добавить следующий параметр сортировки в запрос Solr:

 
...sort=dist(2, geo_x, geo_y, 0, 0) asc

Я подозреваю, что наиболее часто используемые значения первого параметра будут:

  • 1 — расчет на основе манхэттенских метрик
  • 2 — расчет евклидова расстояния

Несколько слов о производительности

До сих пор все хорошо, но как это выглядит с точки зрения производительности? Я сделал два простых теста.

Во время первого теста я проиндексировал 200 000 документов, каждый из которых состоял из четырех полей: идентификатор (числовое поле), описание ( текстовое поле) и местоположение (два числовых поля). Для того , чтобы не затенять результаты испытаний для сортировки, я использовал один из самых простых функций , доступных в настоящее время в Solr — на сумму функцию , которая суммирует два данные аргументов. Я сравнил время запроса сортировки по умолчанию (по счету ) с теми, которые использовали значение функции. В следующей таблице приведены результаты теста:

запрос Количество результатов Время запроса Время повторного запроса
д = *: * & сортировать = оценка + убыв 200,000 31ms 0ms
д = *: * & рода = сумма (geo_x, geo_y) + убывание 200,000 813ms 0ms
д = опись: ала и сортировать = оценка + убыв 200,000 47ms 1мс
д = опись: ала и сортировки = сумма (geo_x, geo_y) + убывание 200,000 797ms 1мс

Другой тест был основан на сравнении сортировки по строковому полю и сортировке с использованием функции. Тест был практически идентичен первому тесту. Я проиндексировал 200 000 проиндексированных документов (с дополнительным полем: name_sort — тип string ) и использовал функцию sum . В следующей таблице приведены результаты теста:

запрос Количество результатов Время запроса Время повторного запроса
д = *: * & рода = opis_sort + убывание 200,000 267ms 0ms
д = *: * & рода = сумма (geo_x, geo_y) + убывание 200,000 823ms 0ms
д = опись: ала и сортировки = opis_sort + убывание 200,000 266ms 1мс
д = опись: ала и сортировки = сумма (geo_x, geo_y) + убывание 200,000 810ms 1мс

Приведенный выше тест показывает, что сортировка с использованием функции сортировки намного медленнее, чем порядок сортировки по умолчанию (что и следовало ожидать). Сортировка по значению функции также выполняется медленнее, чем по строковому полю, но разница не так значительна, как в предыдущем случае.

Несколько слов в конце

Конечно, вышеприведенный тест просто просматривает тему эффективности сортировки с использованием функций Solr, однако показывает прямую связь. Учитывая, что в большинстве случаев это не будет метод сортировки по умолчанию, и, давая нам действительно мощный инструмент, мне кажется, что эту функцию стоит запомнить. Это, безусловно, стоит использовать, когда в требованиях говорится, что мы должны сортировать по значению, которое зависит от запроса и значений индекса — как в случае сортировки по расстоянию от точки, указанной пользователем.