olgerd

Рейтинг
13
Регистрация
21.05.2007
xant:
(имхо) не изобретайте велосипед, а переложите подобные заботы на базу данных. Если не создавать лишних индексов и смоделировать в БД аналог структуры типа "файл", можно выжать очень высокую производительность за счет продвинутых алгоритмов бд (Б* деревья, продвинутые кэши и т.п.)

Речь идёт ведь об обратных списках?

Если хранить вхождения в __обычных__ таблицах, то в таблице должно быть (в простом случае) 3 поля

[text_id] [word_id] [position]

итого, 3 числа на запись (не считаем байты)

при хранении в файле, путь до которого взаимно-однозначно соответствует word_id,

остаётся только два числа;

по мере роста индекса растёт не столько число таких файлов (за счёт новых слов), сколько их размер;

тогда издержки файловой системы состоят из двух частей - путь до файла и набор кластеров файла;

первая часть - константа, вторая - не более процента от объёма; в таком случае при росте индекса

отношение объёмов стремится к 3/2.

Причём файловая система очень хорошо оптимизирована для операции "взять файл по имени и читать его подряд",

а именно так и производится поиск списка документов/вхождений (в первом приближении список и есть результат).

Слияние списков также не противоречит данному подходу - параллельно читаются два заранее известных файла,

каждый из которых читается последовательно.

В базе данных требуется индекс чтобы просто найти вхождения одного слова. То есть сначала ищутся

вхождения word_id в записи таблицы, а потом читаются из этих записей text_id и position.

При простом индексировании (слова заносятся в порядке их нахождения в тексте) вхождения будут разбросаны

по всей таблице, их выборка будет заведомо медленнее чем чтение записей фиксированной структуры из последовательного файла.

Отношение объёма при наличии индекса уже в районе 2/1 и прибавки скорости на поиске по сравнению

с файлами не даст. Без индекса работа с такой таблицей практически невозможна (медленнее на порядки)

и сравнима с прямым поиском.

При создании же на основе базы данных файловой системы, мы вынуждены хранить собственно данные в полях типа

blob, что не даст выигрыша по сравнении с файловой системой на операции поиска, но сильно усложнит доступ к данным.

Другое дело - использовать базу данных для индексирования документов, то есть хранить в ней описания сайтов и

текстов, веса, служебную информацию для пауков и распределение данных по узлам кластера.

Что можно:

1. хранить индекс не в одном файле и не в одном файле на слово, а, например, файл на 256 слов.

Такой индекс сложнее обрабатывать, но удобнее использовать для поиска (нагрузка на файловую систему меньше)

Готовый файл индекса можно и сжать - больше нагрузка на проц, меньше - на ввод-вывод (если там узкое место)

2. сделать чтобы на каждой машине - свой кусок индекса и свой паук - тогда передача будет и вовсе не нужна;

если же захотите избыточность - передача снова потребуется; заметим, что rsync - достаточно сложный протокол,

который сам находит, что изменилось и передаёт разницу; может быть, (вычислительно) проще будет передавать

изменения, зная, что изменилось (процесс инициирует соединение, передаёт имя изменённого файла, его длину

и само содержимое файла - проще даже чем ftp).

3. прямой индекс преобразовывать в обратный только для не очень часто обновляемых страниц; 1-2% самых

"горячих" оставлять в прямом индексе - пока не остынут - позволит как избежать слишком частого перестраивания

индексов, так и перестраивать его не для каждого текста, а как накопится штук так 256. Поиск, соответственно,

проводится как по прямому, так и по обратному индексу, результаты объединяются. Побочный эффект - файл

появляется в поиске сразу же, как до него добредёт паук.