Forum Webscript.Ru

Общие => Базы данных => Тема начата: Uzver от 15 Ноября 2004, 17:16:20

Название: INTERSECT SELECT ???
Отправлено: Uzver от 15 Ноября 2004, 17:16:20
Вопрос, можно ли в MySQL организовать конструкцию типа: “INTERSECT SELECT”. Если у кого-то есть опыт построения подобных запросов в MySQL , или предположения буду признателен за любой совет.
Название: INTERSECT SELECT ???
Отправлено: NeoNox от 15 Ноября 2004, 17:31:34
http://dev.mysql.com/doc/mysql/en/UNION.html ?
Название: INTERSECT SELECT ???
Отправлено: Uzver от 15 Ноября 2004, 17:38:56
Проблема в том, UNION реализован только для версии MySQL 4.0.0 и выше, ради одного клинта провайдер не будет менять текущую весрию MySQL

Спасибо, но этот вариант не подходит.
Название: INTERSECT SELECT ???
Отправлено: NeoNox от 15 Ноября 2004, 19:28:19
У меня больше идей нет, до того момента пока ты не расскажешь что тебе нужно сделать(с примерами запросов и струтурой ДБ)
Название: INTERSECT SELECT ???
Отправлено: Uzver от 16 Ноября 2004, 10:36:18
В общих чертах все выглядит следующим образом. Есть таблица, структуру привожу ниже, в которой хранится соответствие некого количества документов на вхождении некоторых терминов а также количество вхождения терминов в документ. Это таблица обратных индексов используемая для организации поиска по сайту.

Задача, необходимо за один запрос, по возможности конечно, выбрать из данной базы все записи соответствующие условию вхождения всех заданных для поиска терминов в документ (именно всех а не их части) с одновременной сортировкой по  количеству вхождений.

В настоящий момент задача решается следующим образом, выборка из базы производиться запросом «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;
Название: INTERSECT SELECT ???
Отправлено: Phoinix от 16 Ноября 2004, 11:00:04
Uzver
Цитировать

SELECT id_page FROM TermInDoc WHERE id_word=\'…\' OR id_word=\'…\' OR id_word=\'…\' ORDER BY id_page


SELECT id_page, SUM(amount) AS amount
FROM TermInDoc
WHERE id_word IN([перечисление]) GROUP BY id_page ORDER BY amount DESC, id_page

Примерно так, если я правильно понял
Название: INTERSECT SELECT ???
Отправлено: Uzver от 16 Ноября 2004, 11:20:49
Забыл еще одну немаловажную деталь. Поскольку поиск работает в двух режимах «точный поиск» - поиск на точное соответствие заданных поисковых терминов и «приближенный поиск» - поиск по всем возможным «словоформам» от каждого из заданных терминов. В первом случае все как раз и ограничивается одним единственным запросом описанным ранее, а вот во втором случае количество запросов возрастает на количество всех возможных «словоформ» для каждого из заданных терминов с последующим сведением результатов. Вот именно в этом случае и кроется «бутылочное горлышко» алгоритма.
Название: INTERSECT SELECT ???
Отправлено: commander от 16 Ноября 2004, 13:15:46
Uzver
Зачем делать по запросы для каждой словоформы...???
Название: INTERSECT SELECT ???
Отправлено: Uzver от 16 Ноября 2004, 13:21:14
чтобы выбрать все возможные сочетания
Название: INTERSECT SELECT ???
Отправлено: commander от 16 Ноября 2004, 13:21:20
не проще ли для каждого word_id определить список словоформ...?
Название: INTERSECT SELECT ???
Отправлено: Uzver от 16 Ноября 2004, 13:34:25
например?
Название: INTERSECT SELECT ???
Отправлено: commander от 16 Ноября 2004, 13:42:30
Uzver
ну что например.... определяешь словоформы для word_id запрос на определение word_id по словоформе и запрос на определение page и всё...