Архитектура нагруженного поисковика

WP

^_^
Архитектура нагруженного поисковика

Добрый день. Я работаю под текстовым поисковиком (веб) расчитанным на миллионы страниц, хотел бы поделиться своим и узнать ваше мнение о реализации текстового поиска с учетом морфологии.
На данный момент склоняюсь к такому варианту:

таблица с полями:
unsigned int wid - id псевдо-корня слова,
unsigned int tid - id индексируемого текста,
unsigned int fid - id фрагмента,
unsigned int pos - позиция первого символа текущего фрагмента,
unsigned tinyint length - длинная текущего фрагмента
Индекс на wid+tid.

при внесении (изменении) текста:
Разбить текст на фрагменты (например предложения), затем найти уникальные псевдо-корни слов для каждого из фрагментов и вставить в БД для каждого псевдо-корня ряд в вышеописанной таблице.
При поиске, нужно найти уникальные псевдо-корни слов встречающихся в запросе, и составить запрос:
[sql]SELECT `tid` , SUBSTRING( text, pos, length ) AS `snippet`
FROM `indextable`
LEFT JOIN `texts` ON `indextable`.`tid` = `texts`.`id`
WHERE `wid`
IN (
/*...список id псевдо-корней слов из запроса...*/
)
GROUP BY `fid`
[/sql]
Далее полученный результате нужно склеить.
id псевдо-корня вычисляется в зависимости от морфологического движка, в общем случае им может служить контрольная сумма.


Как считаете насколько такая схема оправдана?
Плюсы:
+ можно находить к примеру синонимы просто присвоив им один wid
+ нет необходимости в дополнительном анализе и выделении фрагментов после выборки
Минусы:
- буду думать как учесть расстояние между словами и их последовательность
 

WP

^_^
Спасибо за наводку, смотрю...

-~{}~ 04.08.07 16:34:

Возьму его за основу, неплохая штука.
 

phprus

Moderator
Команда форума
WP
Почитай тему вот в этом форуме: http://forum.searchengines.ru/forumdisplay.php?f=26

Я работаю под текстовым поисковиком (веб) расчитанным на миллионы страниц
Такая схема не выдержит миллионов страниц. Я думаю максимум несколько десятков тысяч.

Предположим, что у нас каждый текст состоит из ~50 уникальных слов, а всего текстов у нас 1 000 000. тогда в таблице indextable у нас будет уже 50 миллионов записей, а выборка по такому количеству записей будет сильно нагружать сервер даже по индексу. Кроме того индексация при такой структуре индекса будет очень медленной из-за большого количества INSERT'ов.

Кроме того доставать описания всех найденных документов сразу - это еще одно узкое место и лишняя работа, так как результаты будут выводиться всего по 10-20 штук на страницу, а найдено может быть несколько тысяч документов.

По этому если хочеш хранить даные в SQL, то делай блочный индекс, чтобы одному слову ставить в соответствие сразу несколько десятков или сотен документов.

Доказать свои слова я сейчас не могу, так как GPRS не позволяет мне найти статьи подтверждающие мои слова. Но по ссылке, которую я дал выше были доказательства медленной работы такой структуры индекса.

P.S. А вообще в поисковике, да особенно нагруженном лучше вообще не использовать SQL-БД, так как она очень быстро станет самым узким местом системы.
 

phprus

Moderator
Команда форума
WP
В гугле например MySQL используется.
Когда тебя отпустит эта трава, то почитай про технологии bigtable(Это хранилище данных), GFS(это их файловая система) и mapreduce (это технология распараллеливания задач).

Кстати, если мне не изменяет память, то такую схему хранения индекса использует MnogoSearch, но он выдерживает только несколько десятков тысяч документов, сохраняя приемлимую скорость поиска.

Кроме того если ты хочеш создать поисковик индексирующий миллионы страниц веба, то изначально проектируй его распределенным. Если ты будеш писать его в надежде, что все индексы поместятся на одном сервере, то ты очень быстро поймешь, что эту реализацию придется выкинуть так как она будет работать медленно и очень быстро достигнет потолка по количеству документов в индексе максимального количества.

В качестве примера открытого поискового движка, который действительно может индексировать миллионы и десятки миллионов страниц, я ба порекомендовал тебе изучить устройство nutch ( http://lucene.apache.org/nutch/ )

P.S. Ты похоже не прочитал ни одной темы по ссылке, которую я тебе дал. А тебе жизненно необходимо прочитать эти темы, чтобы заранее отказаться от неработоспособной технологии.

P.P.S. Если мне не хотят верить на слово и сами не хотят искать доказательства моих слов по ссылке данной выше, то завтра я смогу привести обоснования своих слов, так как завтра у меня будет нормальный интернет, а не этот долбаный GPRS.
 

zerkms

TDD infected
Команда форума
[off]
Когда тебя отпустит эта трава, то почитай про технологии bigtable(Это хранилище данных), GFS(это их файловая система) и mapreduce (это технология распараллеливания задач).
узнаётся GTT в МФТИ ;)))
[/off]
 

Фанат

oncle terrible
Команда форума
WP
phprus в поисковике, да особенно нагруженном лучше вообще не использовать SQL-БД, так как она очень быстро станет самым узким местом системы.

WP В гугле например MySQL используется.
-~{}~ 05.08.07 13:00:

WP
шел бы ты учиться лучше...
 

zerkms

TDD infected
Команда форума
phprus
Google Tech Talks
или информация не оттуда?
 

phprus

Moderator
Команда форума
zerkms
или информация не оттуда?
Информация про то, как устроен гугл вот отсюда: http://labs.google.com/ (Кстати WP не помешало бы прочитать этот сайт).

Остальная информация, которую я говорил - это либо опыт собственного наступания на грабли, либа информация полученная из большого количества источников в интернете.
 

fixxxer

К.О.
Партнер клуба
собственно, во фразе "В гугле например MySQL используется" чисто формально нет ничего неверного - в гугле есть много всякой всячины помимо поиска ;)
хехе.

а для относительно небольших объемов подобные решения работают. только не в таком простом виде, ну собственно с этого все начинали:). сразу могу сказать что места под разные вспомогательные индексы тебе понадобится больше на порядок, в общем думай ;) еще сразу подумай как ты будешь делать партишенинг (или изобретать резиновые винты =)

ну и не изобретай велосипед а посмотри те же mnogosearch/dataparksearch
 

phprus

Moderator
Команда форума
fixxxer
а для относительно небольших объемов подобные решения работают
Надо внимательнее читать первое сообщение. WP пишет, что ему нужно искать по миллионам страниц, но такая схема выдержит максимум несколько сотен тысяч. На сколько я знаю тот же mnogosearch выдерживает приемлимое время поиска только на нескольких сотнях тысяч страниц, те до нескольких миллионов он не дотягивает.

aspseek должен выдержать 5-10 миллионов страниц, а dataparksearch, примерно столько-же, но у aspseek другая схема индекса. Там одному слову ставятся в соответствие сразу несколько документов одной строкой в таблице.
 

fixxxer

К.О.
Партнер клуба
я все внимательно читаю ;)
пара миллионов страниц - это не так много. а больше ему и нафиг не надо я думаю :)
 

WP

^_^
Я уже написал на sphinx :) Правда в бою пока не испробовал т.к. не доделан паук, но по описаниям мне его за глаза хватит, т.к. в реальном проекте на сфинксе поиск по 700,000,000 документов.
 
Сверху