Алгоритмы поиска. Методы построения ИПС. Быстрое изменение индекса.

Тема в разделе "WASM.A&O", создана пользователем apple, 17 июл 2006.

  1. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Допустим любой распространенный язык. Лучше формулами и ссылками :)
    Мне надо изучить методы построения поисковых машин, сейчас делаю нечто похожее на DesktopSearch-поисковик.
    К сожалению, нашел мало дельной информации. Один сайт: itman.narod.ru, а вот зеркало: zaotzs.ru/admin/itman.tar.gz (15 МБ) и еще несколько ссылок с него.
    Все остальное на уровне: делаем таблицу хешей, документов и кроссировучную хеш_документ в обычной БД типа xxx. Индексируйте свои 100 МБ и радуйтесь.

    Не понял, по какому принципу строить хранение индекса. В обычной базе данных типа ACCESS с одним полем уже после 10000 слов (хешей, правильней) начинается видимое замедление работы. А ведь там должны быть и многие другие поля. Вообщем, тормозит на обычных БД с b-деревьями :dntknw:

    Кратко делаю так:
    С помощью IFilter или регулярных выражений (зависит от типа документа) получаю хеш-таблицу слов документа. Убираю повторяющиеся, оставляю приставку и основу, узнаю, что за часть речи (пока абстрактные: существо, действие, описание).
    Добавляю в индекс только новые слова, которых в индексе еще нет. Пишу в кросс-таблицу соответствие слово-документ.
    Вот на добавлении в базу новых слов все тормозит. Это неудивительно, поскольку это делается обычным SQL-запросом.

    Вообщем, если знаете, подскажите, как организовать хранение и бысрую перестройку индекса. Или другой способ организации поиска.
    Лучше подкреплять ответ ссылками.
    Заранее спасибо.
     
  2. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Ребят, Вы что молчите.
    Если что-то непонятно написал - спросите.
    А то как-то неудобно...
     
  3. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Поиска по чему?
     
  4. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Полнотекстный поиск по большому массиву файлов (html, текстовые, doc, rtf и др.)

    1. Берем документ. Создаем хеш-таблицу слов в документе.
    2. От всех слов оставляем только основу.
    3. Сравниваем со словарем и добавляем только новые.

    При поисковом запросе делаем п.п. 1-2. Далее сравниваем со словарем по вхождению слова и выводим результаты.
    Вот простенький алгоритм.

    Проблема в том, что скорость сильно понижается при размере словаря в ~20000 слов.
    А планируется там хранить около 20 млн.
    Так что обычные базы данных здесь не подходят. Тот же DesktopGoogle, например, со своей файловой БД коим-то образом индексирует очень быстро.
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Может быть есть смысл группировать слова в группы и группы тоже маркировать хешами?
    Здесь, мне кажется, очень подходит принцип: "разделяй и властвуй" (как в методе Фурье :)) )
     
  6. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Можно сделать деревья так, что за один спуск можно будет найти слово.
    В Яндексе написано, что такой словарь на 300 тыс. слов занимает около 300 кБ.
    Только как его сделали большой вопрос.

    А слова на группы я разбивал. Быстродействие не прибавилось.
    Из той информации, которую удалось найти, узнал, что "обычные"
    базы данных здесь не помогут. Вопрос в том, что использовать,
    чтобы достичь хорошей скорости (хотя бы как у "игрушечных" Desktop-поисковиков)
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    >>>А слова на группы я разбивал. Быстродействие не прибавилось.
    Этого быть не может. Скорость при грамотном разбиении ДОЛЖНА вырасти (хотя бы незначительно). Фактически, разбиение на группы и есть в некотором смысле построение дерева. Естественно, что одним уровнем разбиения тут не обойтись, надо делать многоуровневое разбиение. Поясню. Первое разбиение на ~30 групп: по первой букве слова. Второе разбиение: каждую группу опять разбиваем на группы, уже по второй букве. Третье разбиение по третьей букве etc. Таким образом, получаем небинарное дерево. При достаточной глубине разбиения поиск слова будет сводиться к проходу по веткам дерева.
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    И вообще, хотелось бы услышать мнение The Svin :))
     
  9. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Наилучший вариант для строковых данных - TST. Ссылок - как грязи ... Начать можно отсюда: http://www.ddj.com/documents/s=921/ddj9804a/9804a.htm
     
  10. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Я в этом мало, что понял.
    Но наверно использовал бы частотный анализ по частоте использования\запросов.
    Частотных подходов очень много, в частности и внутри процессора много частотных алгоритмов (и в кешировании и в предугадывании переходов).
    Вобще тема серьёзная, я бы не стал спешить с предложениями.
    Если на работе бы что-то подобное предложили, моей бестолковке понадобилось бы ~ месяц, чтоб проанализировать и как-то систематизировать то, что к этому может иметь отношение.
    Вот такой неказистый ответ.
    Стареющий и глупеющий Свин...