Участник
Зарегистрирован: Oct 2003
Место проживания: USSR
Публикаций: 7
Статус:  |
RaZEr
это таблицы
CREATE TABLE `a_occurrence` (
`word_id` int(10) unsigned NOT NULL default '0',
`page_id` int(10) unsigned NOT NULL default '0',
`count` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`word_id`,`page_id`),
KEY `page_id` (`page_id`)
) TYPE=MyISAM;
CREATE TABLE `main` (
`idtext` int(10) unsigned NOT NULL default '0',
`date` date NOT NULL default '0000-00-00',
`title` varchar(250) NOT NULL default '',
`donotindex` tinyint(10) unsigned NOT NULL default '0',
`words` mediumint(10) unsigned NOT NULL default '0',
`first_30` varchar(250) NOT NULL default '',
`issue` int(11) NOT NULL default '0',
`filename` varchar(100) NOT NULL default '0',
PRIMARY KEY (`idtext`),
UNIQUE KEY `filename` (`filename`),
KEY `issue` (`issue`),
KEY `title` (`title`(3))
) TYPE=MyISAM;
CREATE TABLE `word` (
`word_id` int(10) unsigned NOT NULL auto_increment,
`table_prefix` varchar(100) NOT NULL default '',
`word_word` varchar(50) NOT NULL default '',
PRIMARY KEY (`word_id`),
UNIQUE KEY `word_word` (`word_word`)
) TYPE=MyISAM;
в таблице main не обращай внимания на date, title, donotindex, words, first_30, issue
эти поля не используются в поиске а используются только как дополнительная информация
о статьях.
как работает индексатор.
1. берем html файл вытаскиваем все слова
2. делаем запись в таблице main для этой статьи
2. берем первое слово проверяем если оно в таблице word. если оно есть берем word_id и
table_prefix (это будет первая буква слова например - а).
если нет пишем новую запись.
3. делаем запись в соответствующей таблице
(если table_prefix = a то это будет a_occurrence)
main.idtext соответствует a_occurrence.page_id
если я ищу по Russian
SELECT main.idtext, main.title, main.donotindex, main.words, main.date,
count(DISTINCT main.idtext) AS dist_count, main.first_30
FROM main INNER JOIN r_occurrence ON r_occurrence.page_id = main.idtext
WHERE (( r_occurrence.word_id = '686' OR r_occurrence.word_id = '1818' ) )
GROUP BY main.idtext ORDER BY main.date DESC LIMIT 0,11
это значит что в таблице word есть например два слова Russian и Russians с word_id
686 и 1818 соответственно
если я ищу по Russian area
SELECT main.idtext, main.title, main.donotindex, main.words, main.date,
count(DISTINCT main.idtext) AS dist_count, main.first_30 FROM main
INNER JOIN a_occurrence ON a_occurrence.page_id = main.idtext
INNER JOIN r_occurrence ON r_occurrence.page_id = main.idtext
WHERE (( a_occurrence.word_id = '576' OR a_occurrence.word_id = '934' )
AND( r_occurrence.word_id = '686' OR r_occurrence.word_id = '1818' ) )
GROUP BY main.idtext ORDER BY main.date DESC LIMIT 0,11
тоже самое но уже для двух слов
если я ищу по Russian region
SELECT main.idtext, main.title, main.donotindex, main.words, main.date,
count(DISTINCT main.idtext) AS dist_count, main.first_30
FROM r_occurrence AS r_occurrence1, main
INNER JOIN r_occurrence ON r_occurrence.page_id = main.idtext
WHERE (( r_occurrence.word_id = '836' OR r_occurrence.word_id = '2182' OR r_occurrence.word_id = '2967' )
AND( r_occurrence1.word_id = '686' OR r_occurrence1.word_id = '1818' )
AND r_occurrence.page_id = r_occurrence1.page_id )
GROUP BY main.idtext ORDER BY main.date DESC LIMIT 0,11
если два слова начинаются на одну букву то значит они проиндексированны в одну таблицу
а значит мы не можем использовать SQL типа
SELECT page_id FROM r_occurrence WHERE word_id = 1 AND word_id = 2
приходиться делать ссылку на таблицу и SQL получается типа
SELECT page_id FROM r_occurrence, r_occurrence AS r_occurrence1
WHERE r_occurrence.word_id = 1 AND r_occurrence1.word_id = 2
как можно понять поиск происходит по логическому AND
в общем так все и работает.
__________________
Сегодня я знаю больше чем вчера, завтра я буду знать больше чем сегодня
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|