Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Пересечение множеств (Глеб) 06/07/2005 - 11:46:32
      Re: Пересечение множеств (Валентин) 06/07/2005 - 14:58:06



From: Глеб - 06/07/2005 - 11:46:32
Subject:Пересечение множеств
-----------------
Здравствуйте!
Есть следующая структура по поиску информации на сайте: все страницы парсятся - убираются комментарии, тэги и прочее. Потом каждая страница разбивается на слова.
В БД есть две таблицы: одна со словами и их id, вторая с id слов и id страниц, на которых они встретились.
таблицы:
create table words (word_id integer primary key, word varchar 255);
create table indexes (word_id integer, page_id integer);

Например, сейчас они заполнены так:
words
---------------------
word | word_id
---------------------
привет | 1
пока | 2
понедельник | 3
суббота | 4

indexes
-----------------
word_id | page_id
-----------------
1 | 1
1 | 2
2 | 2
2 | 3
3 | 1
3 | 3
3 | 4
4 | 2
4 | 4

Вопрос: как выбрать все страницы, на которых встретились нужные слова? Для одного слова все решается просто:
SELECT DISTINCT indexes.page_id FROM indexes, words WHERE words.word_id LIKE 'слово%' AND words.word_id=indexes.word_id;

А для нескольких слов? Оператор OR возращает объединение - т.е. все страницы, на которых встретилось ХОТЬ ОДНО слово, а надо, чтобы только ВСЕ слова.
Решение через IN ('слово1', 'слово2') лишает прелести like 'слово%' - так решаются проблемы с окончаниями и прочие радости.

Сейчас работает через INTERSECT. Например, SELECT DISTINCT indexes.page_id FROM indexes, words WHERE words.word_id LIKE 'слово%' AND words.word_id=indexes.word_id INTERSECT SELECT DISTINCT indexes.page_id FROM indexes, words WHERE words.word_id LIKE 'слово2%' AND words.word_id=indexes.word_id;

ПРоблема: скорость выполнения. При 5, 6 и т.д. слов в запросе, время выполнения быстро растет. Нужны доли секунд, а при 5 словах уже приближается к секунде. Подскажите приемлимое решение, пожалуйста!


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
22918



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |