Кто-нибудь видел реализации фасетного поиска с динамически рассчитываемыми диапазонами? Например, есть цена товара и миллион товаров. После поиска выдаются товары только в диапазоне от 10 до 100 рублей. Может ли система сама умно разбить этот диапазон на несколько поддиапазонов и вывести их в фасетах? Видел ли кто-то такое в сети? Обычно в поисковых движках нужно диапазоны фиксированно задавать, а для примера с ценами, например, это не катит. Удобнее ли это слайдера в фасетах, который в целом ту же роль может играть?
UPDATE: переношу из комментариев:
Очень сырой вариант в голове такой: делать два дополнительных запроса: с сортировкой по цене в одну сторону, в обратную, и в обоих случаях брать первый элемент. Получим разброс цен от минимальной до максимальной. Далее поделить этот диапазон на N частей, и для каждой сделать отдельный запрос на получение числа результатов (чтобы в скобочках выводить). В простейшем случае это N и есть максимальное число групп цен. Если в случае какого-то N мы получаем нули в группах в середине (по краям нулей точно не будет), то объединяем эту группу с соседней, пока ноль не изчезнет. Если производительность позволяет, можно N побольше взять, и уже на клиенте объединять результаты в небольшое число групп, но так, чтобы в каждой группе было примерно равное число элементов. Таким образом, рейнжи мы получим неравномерные по границам, но равномерные по составу элементов. Руки чешутся попробовать, это простая реализация была бы.
Небольшой апдейт. Если просто генерировать равные диапазоны, разделив общий разброс на N, то у пользователя получатся некрасивые диапазоны, с дробными числами и прочим. Поэтому если позволяет производительность Solr, то можно посылать еще запросы на округленные диапазоны и сравнивать результаты с первым. Если максимальный разброс между группами увеличился более, чем на X%, то округление по этой паре групп делаем на шаг слабее. Иначе пробуем округлять уровнем выше.
К примеру, мы получаем 10 чисел в диапазоне от 1 до 3, и еще пять в диапазоне от 56 до 57. Полный диапазон – от 1 до 57. Возьмем N=20. Делаем 20 запросов к солр с диапазонами 1..3.85, 3.85…7.7… и т.д. Получаем 3 числа в первом диапазоне и пять чисел в последнем, а в остальных – по нулям. Округляем 3.85 до 4. Делаем два запроса (от нуля до 4 и от 4 до 7.7). Получаем опять 3 и 0 соответственно. Разброс с предыдущими нулевой, значит оставляем округленное значение (4). Делаем такую же фигню с 53.15..57 – оно округляется до 53..57. Выходит три диапазона (0,4), (4,53), (53, 57). У первого и третьего – положительные значения, их и выводим. У среднего нули, его выводить незачем. Значит отображаем фасет 0..4 и 53..57. Минус тут в том, что мы не можем из 53 сделать 56, не увеличивая N. Вопрос, надо ли это.
Есть идея делать слайдер, а рейнджи представлять в виде гистограммы. Тогда описанное выше отличное ложится на концепт с гистограммами. N определяет число столбиков гистограммы. Неровные числа в рейнжах уже не проблема.
Видимо, вот такой прототип и сделаю. Гистограмма выглядит отличным решением.

