В общих чертах все выглядит следующим образом. Есть таблица, структуру привожу ниже, в которой хранится соответствие некого количества документов на вхождении некоторых терминов а также количество вхождения терминов в документ. Это таблица обратных индексов используемая для организации поиска по сайту.
Задача, необходимо за один запрос, по возможности конечно, выбрать из данной базы все записи соответствующие условию вхождения всех заданных для поиска терминов в документ (именно всех а не их части) с одновременной сортировкой по количеству вхождений.
В настоящий момент задача решается следующим образом, выборка из базы производиться запросом «SELECT id_page FROM TermInDoc WHERE id_word=\'…\' OR id_word=\'…\' OR id_word=\'…\' ORDER BY id_page» с перебором всех заданных для поиска терминов. Затем результат сваливается в массив по которому уже и производится сортировка на соттветсвие и сортировка по реливалентности. Такая схема достаточно сносно работает для небольших сайтов, но вот для крупных, портальных систем она начинает захлебываться, точнее отнимать слишком много ресурсов. Пока сайт еще не дорос до отдельного сервера, поэтому возникла необходимость максимально оптимизировать структуру поискового алгоритма. Да и в случае с выделенным сервером лучше чтобы задача выполнялась максимально быстро при минимальных затратах ресурсов.
CREATE TABLE `TermInDoc` (
`id` int(11) NOT NULL auto_increment,
`id_word` int(11) NOT NULL default \'0\',
`id_page` int(11) NOT NULL default \'0\',
`amount` int(11) NOT NULL default \'0\'
PRIMARY KEY (`id`)
) TYPE=MyISAM;