Xpoint
   [напомнить пароль]

Поиск на Xpoint

Разработка поисковой системы для Xpoint находится сейчас на стадии проектирования. Поисковая система будет состоять из трёх частей: поисковый сервер, поисковый клиент и индексатор.

Поисковый сервер

  • Работает как демон, получает запросы на UDP-порт (слушает только localhost, конечно)
  • "Автоподнималка" поиска запускается по cron каждую минуту.
  • На Xpoint примерно 10 тысяч индексируемых страниц. Если уложимся в 2 kB данных на страницу, то можно хранить все индексы в памяти.
    • Если памяти будет расходоваться слишком много, то в памяти можно будет держать только хеш-таблицу, а сами данные в файлах. Но это нежелательно.
  • Perl слишком расточительно обходится с памятью, для работы с индексами нужно будет написать XS-модуль.
  • Для оптимизации скорости доступа и расхода памяти для индексов надо бы вспомнить алгоритм perfect hashing. Если будем использовать, то составление индекса будет медленной операцией.
    • Надо проверить с реальными данными, насколько тот или иной алгоритм повысит расход памяти, а также время поиска.

Поисковый клиент

  • CGI скрипт, посылает UDP-запрос поисковому серверу, получает в ответ отсортированный список страниц, возможно рейтинги
  • Переводит строку поиска в логическое выражение
  • Кеширует ответы в файлах (к примеру, чтобы можно было быстро переходить по страницам), поиск чистит этот кеш при перезапуске
  • Поддержка морфологии: при поиске нужно будет искать и словоформы от заданного слова. Это не касается фраз, заключённых в кавычки.
  • Проиндексированная часть страниц (упрощённая разметка) хранится в файлах, клиент сам находит в ней подходящие отрывки для отображения.

Индексатор

  • Переиндексация происходит постоянно, это тоже демон (и тоже с "автоподнималкой"), работает с низким приоритетом.
  • Информация с предыдущих индексаций хранится в развёрнутом виде в файлах, индексатор должен её лишь обновить.
  • После обработки обновлений индексатор заново создаёт оптимированную двоичную структуру индексов и перезапускает поиск (будет происходить примерно каждые несколько часов)
    • Как вариант возможно инкрементальное обновление индексов — сразу, как только происходят изменения. В этом случае индексатор будет объединён с поисковым сервером (будет обновлять индекс в "свободное от работы время"). Можно ли это реализовать, пока точно сказать нельзя, зависит от структуры индексов.
  • Каждая страница получает вес, зависящий от её типа (активная тема/архив/база знаний/...), даты последнего обновления, ссылающихся страниц. Этот вес умножается на вес ключевых фраз на странице.
    • Возможно индексировать страницы не целиком, а как совокупность сообщений (форум) или разделов (база знаний). Проблемы:
      • Как эффективно объединить результаты в различных сообщениях одной страницы?
      • Если одно слово запроса найдено в одном сообщении, а другое — в другом, нужно ли выдавать этот результат?
      • Если нужно: куда должна указывать ссылка?
    • Вариант: индексация страницы целиком, но с пометками к структуре. Поисковый клиент сможет определить, находятся ли все наденные слова в одном разделе страницы — в этом случае он выдаст ссылку на конкретный раздел.
  • В качестве ключевых фраз нужно поддерживать последовательности до трёх слов.
    • Что считать однозначным разделителем фраз? точка/конец ссылки/конец параграфа/...
  • Ключевые фразы различаются по категориям (метка/текст/ссылка/...), для каждой категории нужен отдельный индекс (хеш-таблица общая). В результатах поиска результаты по категориям нужно будет скомбинировать с соответствующими весовыми факторами.
  • Информация для индексатора поставляется плагинами, по одному на каждый тип страницы. Задачи плагинов:
    • Составить список страниц, обновлённых после определённой даты
    • Для запрошенной страницы вернуть XHTML-код (возможно, уже прошедший предварительную обработку), дату последнего изменения, тип страницы (для определения её относительного веса)
  • Парсер исходит из того, что на вводе валидный XHTML-код. Интерпретируется минимальное количество тегов (<a>, <p>), остальные удаляются. Категории (см. выше — метка/текст/ссылка/...) определяются по классу элемента, реже — по имени тега.
Powered by POEM™ Engine Copyright © 2002-2005