|
|
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
описание проблемы: есть огромная таблица, по которой производится полнотекстовый поиск. выбирается так же вычисляемое поле (зависящее от ts_rank_cd() и еще нескольких параметров, но это не особо важно), назовем его rank . надо быстро получить ~N максимально релевантных запросу записей (с наибольшими значениями rank ).. если делать в лоб - напрашивается SELECT ... ORDER BY rank DESC LIMIT N.. но сортировка в данном случае не приемлема в виду огромности таблицы : ) как бы сделать так, что бы получить сначала N = ~1000 записей, а уже затем их отсортировать между собой... пишу '~', т.к. предполагаю, что некоторые варианты решения могут быть не совсем точными, хотя это только предположение : ) есть подозрения, что может помочь статистика или что-то вроде, но ничего конкретного пока не придумывается... ; ) так же есть соображения, что алгоритм будет подразумевать нахождение сначала некоего граничного значения rank = X, которое будет минимальным релевантным, и далее SELECT ... WHERE rank >= X ну и последующая сортировка.. идеи ? : ) ps: вопрос скорее алгоритмический, нежели по постгресу, но я не знал, где еще его опубликовать : ) Модератор: Тема перенесена из форума "PostgreSQL". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2010, 20:10 |
|
||
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
думаю ошибочно перенесли данный вопрос в ветку проектирования БД. таблица уже есть и "огромная таблица" и ТС не собирается ее реструктуризировать. Вопрос скорее всего в построении sql запроса- при котором нужно знать тонкости конкретной БД, а в нашем случае, как я поняла, PostgreSQL. не знакома с PostgreSQL, но чем вам не травится предложенное вами же решение: подзапрос сокращающий количество записей, подходящих под условие, с последующей их сортировкой? select * from (SELECT ... WHERE rank >= X) ORDER BY rank DESC LIMIT N ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2010, 21:15 |
|
||
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
вопрос перенесения - спорный, да не суть.. хотя жаль, что при переносе куда-то пропали абзацы.. ; ) select * from (SELECT ... WHERE rank >= X) ORDER BY rank DESC LIMIT N это замечательно, но X - неизвестен, прочитайте повнимательнее : ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2010, 21:35 |
|
||
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
ok32есть огромная таблица, по которой производится полнотекстовый поиск. выбирается так же вычисляемое поле (зависящее от ts_rank_cd() и еще нескольких параметров, но это не особо важно), назовем его rank . надо быстро получить ~N максимально релевантных запросу записей (с наибольшими значениями rank ).. как бы сделать так, что бы получить сначала N = ~1000 записей, а уже затем их отсортировать между собой... Поисковик... Выкиньте из головы промышленные СУБД и напишите свою с нормальными обратными индексами и морфологией. Если из Москвы и интересно подробнее - добро пожаловать в личку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2010, 01:13 |
|
||
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
не уже ли нет более приземленных методов, чем написание собственной субд? % ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2010, 18:02 |
|
||
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
ok32описание проблемы: если делать в лоб - напрашивается SELECT ... ORDER BY rank DESC LIMIT N.. но сортировка в данном случае не приемлема в виду огромности таблицы : ) А вы пробовали? Замеры делали? Кроме того, для того, чтобы СУБД могла решить, подпадает ли значение под понятие "максимально релевантный", он должна знать и другие значения. Значение, взятое само по себе, не может быть признано ни релевантным, ни нерелевантным. Другое дело, что здесь возможно наилучшим будет всё же перебор таблицы по курсору с корректировкой текущего списка строк-кандидатов (т.е. очередная строка добавляется в список, вытесняя, возможно, худшую из списка, или не добавляется. Но тут для анализа эффективности надо исследовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2010, 14:46 |
|
||
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
Евгений Мирошниченко aka mirok32описание проблемы: если делать в лоб - напрашивается SELECT ... ORDER BY rank DESC LIMIT N.. но сортировка в данном случае не приемлема в виду огромности таблицы : ) А вы пробовали? Замеры делали? Кроме того, для того, чтобы СУБД могла решить, подпадает ли значение под понятие "максимально релевантный", он должна знать и другие значения. Значение, взятое само по себе, не может быть признано ни релевантным, ни нерелевантным. Другое дело, что здесь возможно наилучшим будет всё же перебор таблицы по курсору с корректировкой текущего списка строк-кандидатов (т.е. очередная строка добавляется в список, вытесняя, возможно, худшую из списка, или не добавляется. Но тут для анализа эффективности надо исследовать.да, замеры проводилиь.. все упирается в сортировку всей таблицы... а на счет вытеснения - в постгресе на этот счет вроде как topN heapshot существует, но он тоже не особо в моем случае убыстряет процесс .. ; ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2010, 16:55 |
|
||
|
выборка ~N записей с наибольшим значением поля без сортировки
|
|||
|---|---|---|---|
|
#18+
GrayStrannikok32есть огромная таблица, по которой производится полнотекстовый поиск. выбирается так же вычисляемое поле (зависящее от ts_rank_cd() и еще нескольких параметров, но это не особо важно), назовем его rank . надо быстро получить ~N максимально релевантных запросу записей (с наибольшими значениями rank ).. как бы сделать так, что бы получить сначала N = ~1000 записей, а уже затем их отсортировать между собой... Поисковик... Выкиньте из головы промышленные СУБД и напишите свою с нормальными обратными индексами и морфологией. Если из Москвы и интересно подробнее - добро пожаловать в личку. из Москвы и стало интересно, но.. личку не нашел % ) в общем, вопрос все еще актуален.. как все же сортировать результаты по релевантности если их очень много? есть конечно вариант предрасчитывать некие ранки (которые не зависят от запроса) документам и по ним всегда сортировать (тогда получается индекс скан и все), но тут минусы очевидны.. а как адекватно предрасчитать зависимые от запроса ранки мне не представляется.. я не верю, что никто здесь не сталкивался с такой проблемой ; ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2010, 19:25 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36403572&tid=1542819]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
362ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 678ms |

| 0 / 0 |
