powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / выборка ~N записей с наибольшим значением поля без сортировки
8 сообщений из 8, страница 1 из 1
выборка ~N записей с наибольшим значением поля без сортировки
    #36395882
ok32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
описание проблемы:
есть огромная таблица, по которой производится полнотекстовый поиск.
выбирается так же вычисляемое поле (зависящее от ts_rank_cd() и еще нескольких параметров, но это не особо важно), назовем его rank .
надо быстро получить ~N максимально релевантных запросу записей (с наибольшими значениями rank )..
если делать в лоб - напрашивается SELECT ... ORDER BY rank DESC LIMIT N..
но сортировка в данном случае не приемлема в виду огромности таблицы : )
как бы сделать так, что бы получить сначала N = ~1000 записей, а уже затем их отсортировать между собой...
пишу '~', т.к. предполагаю, что некоторые варианты решения могут быть не совсем точными, хотя это только предположение : )
есть подозрения, что может помочь статистика или что-то вроде, но ничего конкретного пока не придумывается... ; )
так же есть соображения, что алгоритм будет подразумевать нахождение сначала некоего граничного значения rank = X, которое будет минимальным релевантным, и далее SELECT ... WHERE rank >= X ну и последующая сортировка..
идеи ? : )

ps: вопрос скорее алгоритмический, нежели по постгресу, но я не знал, где еще его опубликовать : )

Модератор: Тема перенесена из форума "PostgreSQL".
...
Рейтинг: 0 / 0
выборка ~N записей с наибольшим значением поля без сортировки
    #36395914
Фотография SunnyGirl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю ошибочно перенесли данный вопрос в ветку проектирования БД. таблица уже есть и "огромная таблица" и ТС не собирается ее реструктуризировать. Вопрос скорее всего в построении sql запроса- при котором нужно знать тонкости конкретной БД, а в нашем случае, как я поняла, PostgreSQL. не знакома с PostgreSQL, но чем вам не травится предложенное вами же решение: подзапрос сокращающий количество записей, подходящих под условие, с последующей их сортировкой?
select * from (SELECT ... WHERE rank >= X) ORDER BY rank DESC LIMIT N
...
Рейтинг: 0 / 0
выборка ~N записей с наибольшим значением поля без сортировки
    #36395926
ok32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос перенесения - спорный, да не суть.. хотя жаль, что при переносе куда-то пропали абзацы.. ; )

select * from (SELECT ... WHERE rank >= X) ORDER BY rank DESC LIMIT N
это замечательно, но X - неизвестен, прочитайте повнимательнее : )
...
Рейтинг: 0 / 0
выборка ~N записей с наибольшим значением поля без сортировки
    #36396484
GrayStrannik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ok32есть огромная таблица, по которой производится полнотекстовый поиск.
выбирается так же вычисляемое поле (зависящее от ts_rank_cd() и еще нескольких параметров, но это не особо важно), назовем его rank .
надо быстро получить ~N максимально релевантных запросу записей (с наибольшими значениями rank )..
как бы сделать так, что бы получить сначала N = ~1000 записей, а уже затем их отсортировать между собой... Поисковик... Выкиньте из головы промышленные СУБД и напишите свою с нормальными обратными индексами и морфологией. Если из Москвы и интересно подробнее - добро пожаловать в личку.
...
Рейтинг: 0 / 0
выборка ~N записей с наибольшим значением поля без сортировки
    #36401697
ok32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не уже ли нет более приземленных методов, чем написание собственной субд? % )
...
Рейтинг: 0 / 0
выборка ~N записей с наибольшим значением поля без сортировки
    #36403572
ok32описание проблемы:
если делать в лоб - напрашивается SELECT ... ORDER BY rank DESC LIMIT N..
но сортировка в данном случае не приемлема в виду огромности таблицы : )

А вы пробовали? Замеры делали?
Кроме того, для того, чтобы СУБД могла решить, подпадает ли значение под понятие "максимально релевантный", он должна знать и другие значения. Значение, взятое само по себе, не может быть признано ни релевантным, ни нерелевантным. Другое дело, что здесь возможно наилучшим будет всё же перебор таблицы по курсору с корректировкой текущего списка строк-кандидатов (т.е. очередная строка добавляется в список, вытесняя, возможно, худшую из списка, или не добавляется. Но тут для анализа эффективности надо исследовать.
...
Рейтинг: 0 / 0
выборка ~N записей с наибольшим значением поля без сортировки
    #36414592
ok32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений Мирошниченко aka mirok32описание проблемы:
если делать в лоб - напрашивается SELECT ... ORDER BY rank DESC LIMIT N..
но сортировка в данном случае не приемлема в виду огромности таблицы : )

А вы пробовали? Замеры делали?
Кроме того, для того, чтобы СУБД могла решить, подпадает ли значение под понятие "максимально релевантный", он должна знать и другие значения. Значение, взятое само по себе, не может быть признано ни релевантным, ни нерелевантным. Другое дело, что здесь возможно наилучшим будет всё же перебор таблицы по курсору с корректировкой текущего списка строк-кандидатов (т.е. очередная строка добавляется в список, вытесняя, возможно, худшую из списка, или не добавляется. Но тут для анализа эффективности надо исследовать.да, замеры проводилиь.. все упирается в сортировку всей таблицы...
а на счет вытеснения - в постгресе на этот счет вроде как topN heapshot существует, но он тоже не особо в моем случае убыстряет процесс .. ; )
...
Рейтинг: 0 / 0
выборка ~N записей с наибольшим значением поля без сортировки
    #36503643
ok32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GrayStrannikok32есть огромная таблица, по которой производится полнотекстовый поиск.
выбирается так же вычисляемое поле (зависящее от ts_rank_cd() и еще нескольких параметров, но это не особо важно), назовем его rank .
надо быстро получить ~N максимально релевантных запросу записей (с наибольшими значениями rank )..
как бы сделать так, что бы получить сначала N = ~1000 записей, а уже затем их отсортировать между собой... Поисковик... Выкиньте из головы промышленные СУБД и напишите свою с нормальными обратными индексами и морфологией. Если из Москвы и интересно подробнее - добро пожаловать в личку.
из Москвы и стало интересно, но.. личку не нашел % )

в общем, вопрос все еще актуален.. как все же сортировать результаты по релевантности если их очень много?

есть конечно вариант предрасчитывать некие ранки (которые не зависят от запроса) документам и по ним всегда сортировать (тогда получается индекс скан и все), но тут минусы очевидны.. а как адекватно предрасчитать зависимые от запроса ранки мне не представляется..

я не верю, что никто здесь не сталкивался с такой проблемой ; )
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / выборка ~N записей с наибольшим значением поля без сортировки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]