Автор Тема: Индексация случайного текста и последующее обновление...  (Прочитано 5043 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Есть полностью непредсказуемый текст..
Каждая запись весит около 40 KB в среднем.
Таких записей около полумиллиона.
И по ним нужно производить поиск.
... :-) Мерзко, да?
Единственным выходом - является создание словаря по тексту...
Но возникает проблема... Этот текст может в случайное время обновиться, и тогда необходимо обновить таблицу связей между словарём и текстом - то есть в какой из записей какие слова хранятся.
Хм... бошку ломаем и ничего дельного в голову не приходит..
база MySQL, то есть триггерочками не побалуешься, да и не совсем это выход здесь. Необходима универсальная обновляемая структура базы с двумя критериями:
1. быстрый поиск.
2. относительно быстрое обновление.

Какие будут идеи?

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
1. mnogosearch
2. если уж делаешь словарь, то обновление связей надо будет делать вручную (на Перл например).
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
1. А многоsearch не помрёт на таком количестве записей? :-)
2. Оно и делается вручную... На РНР...
Только вот как спроектировать структуру базы, ибо в словаре будет несколько детясков тысяч слов... и записей будет около полумиллиона... И таблица связей между ними - многие-ко-многим будет в таком случае весить пару-тройку миллионов записей...

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Dj Fly
Ну структура таблиц какая ?
ИМХО она будет выглядеть примерно так:
texts_table: - таблица текстов
text_id | text

words_table - таблица слов
word_id | word

relations_table - таблица связей текста со слвами
text_id | word_id

после определенного этапа таблица words_table будет обновляться очень редко (в ней уже будет много слов).
И обновляться будет только таблица relations_table. Она имеет фиксированную ширину и два числовых поля. С такими таблицами mysql работает очень быстро

Думаю если тексты в 40 кб хорошо почистить от всяких дублирующих слов, тегов то слов там будет не так много
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
насчет mnogosearch - не думаю что для него это много
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Ну да, структура таблиц и сейчас именно такая...
Но будет ли это быстро при забивке данными?
Ибо сейчас там немного лежит...

Хм... а каковы его возможности, ентого мегасёрча? :-)

И насколько быстро работает мускуль с такими таблицами?
Особенно если они содержать лимон-другой записей?
Ведь поиск с точки зрения юзера, поиск должен проходить не более пары секунд...

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
что мешает протестировать самому ?
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
Dj Fly, а FULLTEXT индекс не устраивает?
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
"+" при этом подходе:
- простота использования
- автоматом обновляется
- шаблоны (правда тока в бин моде, и с начала строки)
- ревалентность
"-"
- отсутствие морфологического поиска.
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Хм.... в подополнение к этой теме...
Работа над системой начата...
Первым этапом был собиральщик адресов определённого сегмента Инета...
Для этого был написан нормальный выдиральщик линков из страниц, который тупо вставляет все собранные линки в базу следующей структуры:
|id int auto_increment | url primary key varchar(255) | lastupdate int(11) |
Поле урл объявлено как ключ для исключения дублирования адресов...
С таблицей этой происходит лишь выборка одного урла, где lastupdate=0 и тут же внос всех найденных линков на этой странице.

Всё тащится отдельными потоками в количестве 30 штук с использованием LOCK TABLES на время выборки урла и до момента помечивания его как уже пройденного - то есть тут же, после получения его ID - ещё не таща саму страницу из инета

Добравшись до 300 000 записей эта таблица начала безбожно тормозить и запрос select count(*) занимает 4-5 секунд.

Есть ли какие-либо способы оптимизировать это действо по скорости??
« Последнее редактирование: 21 Апреля 2004, 14:02:21 от Dj Fly »

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Неясно ещё одно, если сортировать эту таблицу по полю УРЛ - то проверка на уникальность записи при вносе - будет занимать минимальное количество времени - например поиск делением пополам - будет и проверять и уникальность и сразу вставлять новый урл в то место, где он должен быть.

Программными средствами делать это - бредово.
Какие средства есть для этого в мускуле - и каким образом нужно создать таблицу,чтобы убедиться, что это именно так.
Было проверено время выполнения скрипта - внос в эту таблицу 20-30 урлов происходит не более чем за одну секунду, то есть мускуль уже явно использует нечто вроде этого.
от 3 до 5 секунд занимает пачка из следующих операций:
1. lock table for write;
2. select id,url where lastupdate=0;
3. update table where id=thisid;
4. unlock tables;

то есть даже не таща саму страницу, это действо каким-то образом занимает тонну времени...
Может есть другое средство избежать лочинья таблиц, но ведь одновременно запущенные 30 потоков начинают жрать одни и те же урлы по нескольку раз.
Сам по себе lock много времени не жрёт... убрав его при одном запущенном потоке ускорение составило лишь одну секунду.
Проблема в выборке адреса и обновлении его поля.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28