Как написать поисковую программу

Я собираюсь создать быструю поисковую систему для сайта, которая сможет поддерживать поисковые запросы с автоматическим заполнением (живым поиском) и бесплатным размещением на хостинге. Для этого буду использовать wget, Python, SQLite, Jupyter, sqlite-utils. А также открытое программное обеспечение Datasette , чтобы создать API-интерфейс.

Рабочий пример создаваемой поисковой системы.

Шаг 1: сканирование данных

Сначала нужно получить копию данных, которые должны быть доступны для поиска.

Для этого можно создать копию прямо из базы данных или извлечь ее с помощью API. Но я создам простой сканер, используя wget – инструмент командной строки с мощным «рекурсивным» режимом, который идеально подходит для загрузки содержимого сайтов.

Начнем со страницы https://24ways.org/archives/. На странице представлены публикации за каждый год работы сайта. Затем дадим команду для wget провести рекурсивное сканирование сайта, используя флаг —recursive.

Нам не нужно загружать каждую страницу сайта ‒ нас интересуют только актуальные статьи. Поэтому вытянем только публикации за определенные года. Для этого используем аргумент -I следующим образом:

КАК СОЗДАТЬ СВОЮ ПОИСКОВУЮ СИСТЕМУ | разработка поисковика | персонализация и ранжирование контента


-I /2005,/2006,/2007,/2008,/2009,/2010,/2011,/2012,/2013,/2014,/2015,/2016,/2017

Установим время ожидания для каждого запроса продолжительностью в 2 секунды: —wait 2

Также исключим из сканирования станицы комментариев, используя команду -X «/*/*/comments» .

Чтобы повторно не загружать в результатах поиска одинаковые страницы, используем параметр —no-clobber.

Код, отвечающий за запуск перечисленных выше команд:

wget —recursive —wait 2 —no-clobber -I /2005,/2006,/2007,/2008,/2009,/2010,/2011,/2012,/2013,/2014,/2015,/2016,/2017 -X «/*/*/comments» https://24ways.org/archives/

Запустите его и через несколько минут вы получите подобную структуру:

$ find 24ways.org 24ways.org 24ways.org/2013 24ways.org/2013/why-bother-with-accessibility 24ways.org/2013/why-bother-with-accessibility/index.html 24ways.org/2013/levelling-up 24ways.org/2013/levelling-up/index.html 24ways.org/2013/project-hubs 24ways.org/2013/project-hubs/index.html 24ways.org/2013/credits-and-recognition 24ways.org/2013/credits-and-recognition/index.html .

Для проверки работоспособности примера подсчитаем количество найденных HTML-страниц:

$ find 24ways.org | grep index.html | wc -l 328

Опыт написания поисковой системы

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

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

Поиск как у гугла для любого сайта

Ваши отзывы оставляйте на форуме этого сайта.

С Уважением, Михаил

Оглавление

  • Введение.
  • Постановка задачи.
  • Форматы файлов данных
  • Алгоритм поиска по индексу.
  • Плюсы и минусы алгоритма.
  • Системные требования.
  • Использование.

1. Введение.

Поисковая система состоит из 3 мощных компьютеров, каждый из которых выполняет свои задачи:

  • WWW-сервер. Отвечает за взаимодействие поисковой системы с пользователем. Предоставляет удобный и наглядный интерфейс для задания запросов.
  • Поисковая машина. Это, как правило, очень мощный компьютер, который обрабатывает базу индексов в соответствии с полученным запросом.
  • Поисковый робот. Компьютер, оснащённый специальной программой, которая непрерывно просматривает весь Интернет, индексируя все все встречающиеся Web-страницы, и обновляя базу индексов.

Так устроены все поисковые системы, их различие состоит по сути лишь в вычислительной мощности перечисленных элементов и их программном обеспечении.

Рассмотрим теперь более подробно, как происходит поиск информации с помощью поисковой системы.

Пользователь, желая найти необходимую информацию с помощью браузера Интернет соединяется с WWW-сервером поисковой системы. На основной странице, как правило, содержится поле, в котором набирается запрос, например, одно или несколько ключевых слов, а также специальных слов и символов. После того как запрос подготовлен, пользователю остаётся отдать команду на поиск Web-страниц, которые соответствовали бы запросу. Как правило, для этого есть кнопка Search, Find, Submit и т.д. Сформированный запрос передаётся на поисковую машину.

Читайте также:
Игровая программа улыбка и смех это для всех

Поисковая машина, получив запрос от WWW-сервера, просматривает собственную базу индексов, т.е. базу данных обо всех зафиксированных поисковой системой Web-страниц. В этой базе для каждой Web-страницы, которую просмотрел поисковый робот, имеется индекс — список встречающихся на этой странице значащих слов (исключая предлоги, союзы и междометия).

После того как найдены адреса всех Web-страниц, отвечающих запросу, создаётся список адресов, который и предъявляется пользователю в окне браузера. Если быть более точным, то в большинстве случаев на WWW-сервере поисковой системы создаётся Web-страница, состоящая из списка адресов, удовлетворяющих запросу. Это можно заметить по строке адреса в браузере. Список содержит аннотации и активные ссылки, по которым можно переключиться на интересующие вас серверы Интернета.

Наконец, за всем этим стоит непрерывная и кропотливая деятельность поискового робота, который днём и ночью просматривает все доступные Web-сайты и составляет их индексы, обновляя собственную базу индексов, которая используется, как это было описано выше, для составления ответов на запросы пользователя.

Многие поисковые системы предоставляют возможность занесения собственного адреса в список индексируемых ресурсов

Постановка задачи

Основная задача нашей поисковой системы — простота установки, минимальные системные требования и высокая скорость работы.

Большинство существующих поисковых систем требуют один или несколько выделенных серверов, я же пытался написать поисковый механизм не требующий не только выделенного сервера, но не требующий даже дополнительного ПО, такого как SQL сервера.

Весь индекс поисковой системы хранится в файлах, имеющих сложную древовидную структуру.

Программа состоит из двух основных частей — поисковый работ (индексатор) и механизм поиска по индексу.

Рассмотрим более подробно функции каждой части:

Индексатор:

Индексатор должен выполнять следующие действия:

  • Поиск файлов заданного типа на диске. (обычно HTML, HTM, STHML,SHTM)
  • Выделение из каждого файла заголовка (в HTML документах заголовок находится между тегами и )
  • Выделение информации из документов, фильтрация скриптов (теги :), таблиц стилей (..), комментариев () и других служебных лексем.
  • Сохранение информации о документах в специальном файле, присвоение документу уникального номера.
  • Сохранение информации о каждом слове, и номере документа в индексе.

Механизм поиска по индексу.

  • Механизм должен искать в индексном файле каждое слово из поискового запроса.
  • Должен сортировать результаты поиска по релевантности и соответствию.
  • В первую очередь выводятся результаты строго соответствующие запросу (если каждое слово запроса существует в найденном документе).
  • Результаты сортируются по релевантности — количеству слов запроса, встреченных в найденном документе.

Форматы файлов данных

Файл, содержащий список файлов (files)

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

Таблица 1 — информация о документе.

Индексный файл (index):

  • Содержит информацию о словах встречающихся в документах, и принадлежность слова документу.
  • Имеет древовидную структуру, состоящую из двух типов записей. Всегда начинается с записи идентификации слова.

Таблица 2 — запись идентификации слова.

Смещение Размер Описание
4 Значение хеш функции слова
4 32 Слово (заглавными буквами)
36 4 Указатель на следующую структуру идентификации слова, значение хеш функции которой меньше текущего. Если ноль, то конец ветви дерева.
40 4 Указатель на следующую структуру идентификации слова, значение хеш функции которой больше текущего. Если ноль, то конец ветви дерева.
44 4 Указатель на структуру идентификации документа.
Читайте также:
Что можно сделать в эксель программе

Таблица 3 — запись идентификации документа.

Смещение Размер Описание
4 Номер документа (N). Информация о документе может быть получен из файла files по смещению (N*1024) (см. таблицу 1)
4 4 Сколько встречается слово в этом документе
8 4 Указатель на следующую структуру идентификации документа. Если ноль, то документов содержащих поисковое слово больше нет.
12 4 Зарезервировано

Алгоритм поиска по индексу.

Допустим мы ищем слово МИР, значение хеш функции — 173h

Таким образом, мы установили, что слово мир, встречается 4 раза в документе №17. Информацию о документе мы можем получить из файла files по смещению 17*1024=17408

Плюсы и минусы алгоритма.

Достоинствами программы являются:

  • 1. Низкие системные требования
  • 1.1 Индексатор:
  • 1.1.1 Процессор: 486dx и выше
  • 1.1.2 Память: 8Mb
  • 1.1.3 Место на жестком диске в зависимости от размеров индексируемых данных
  • 1.1.4 ОС: Windows95/98/ME/2000, FreeBSD Unix 4.3, S.U.S.E. Linux 7.1
  • 1.2.1 ПО: PHP 3.0 и выше, к аппаратной части не привязан.

Недостатками программы являются:

  • Не возможность работы с протоколами HTTP и FTP
  • Не возможность обновления индексных файлов (необходимо все индексировать заново)
  • Не высокая скорость индексатора (на 2xP-III, SCSI, S.U.S.E. Linux скорость составила ~230 Kb/сек)

Использование программы.

Работа с индексатором:

Работа с индексатором (для Unix и Linux — indexer, для Windows — indexer.exe) производится посредством ключей командной строки:

Для ОС Windows

C:> indexer.exe путь расширения
  • путь — каталог с HTML документами.
  • расширения — расширения обрабатываемых файлов через запятую.

Для ОС семейства Unix

bash# /home/user/indexer путь расширения
  • путь — каталог с HTML документами.
  • расширения — расширения обрабатываемых файлов через запятую.
bash# /home/user/indexer ./htdocs/ html,html,shtm,shtml

Работа с системой поиска по индексу:

Для установки системы поиска по индексу необходимо выполнит следующие действия.

  • Скопировать файлы search.php, top.php и config.php в WWW каталог сервера поддерживающего PHP версии 3.0 и выше.
  • Изменить файл config.php следующим образом:

Переменная debug используется в процессе установки поисковой системы, при debug=1 в результатах поиска выводится время потраченное на него.

(*) Переменная $opt_path содержит путь индексируемого каталога на локальном диске, причем слеши должны быть «/». А переменная $opt_url содержит путь в «WWW» к этому же каталогу.

Скачать версию для Windows можно здесь.

Источник: codenet.ru

Как я написал свою поисковую систему для быстрого поиска личной информации

Все началось с того, что мне стало трудно находить нужную информацию, файлы. Чем больше файлов и папок у меня образовывалось, тем больше времени уходило на поиски нужного. Я понял, что каждый раз искать в бесконечных списках файлов и папок, особенно с условием вложенности это не вариант для больших объемов данных.

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

Более того по содержанию можно искать только текстовые файлы.

Структура содержания информации

Структура папок представляется собой в виде дерева. Мне это не нравится, потому что каждая папка может содержать только определенные файлы, если не учитывать копирование и ссылки.

Так же это можно представить с примером из реальной жизни, для того, чтобы найти зелёное свежее яблоко сорт «девственный». Необходимо найти отдел с фруктами, затем отдел с яблоками, затем ищем зеленные, затем сорт, ну там ещё их на свежие, не свежие фасуют в этом воображаемом примере и наконец найти нужное apple.

Читайте также:
Температура процессора программа cpuid

Усложняется ещё все и тем, что я не помню есть ли там вообще яблоки, и если есть, то хранятся ли они в отделе фрукты там продаются.

А почему бы об этом просто не попросить прихвостня(они уже у всех есть, правда?) -«Принеси мне зелёное свежее яблоко».

Как сразу становится удобно!

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

А вот если мы не знаем существуют ли яблоки вообще, то спрашиваем прихвостня:

— «Есть, господин! Сотни, игрушечные, красные, гнилые..».

— «Мне нужно свежее яблоко».

— «Понял! Есть красное свежее яблоко «Сирота», красное свежее яблоко «курага». ».

— «А что насчёт зелёного свежего яблока».

— «Есть! Зелёное свежее яблоко «Пух-тибидух» и Зелёное свежее яблоко «Девственный»».

— «В таком случае, принеси мне, пожалуй, Зелёное свежее яблоко «Девственный»».

Вот последняя фраза как раз таки и стала названием приложения. Как ответ на команду пользователя — «Yes Sir».

Возвращаясь к яблокам. Заметили, что в первом случае нужно искать яблоки не пойми где, а во втором мы задаём уточняющие условия к запросу! ?

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

Приведу пример более реалистичный. Есть папка с музыкой и подпапки для разделения на жанры. Но что если в какой-то момент мне захочется послушать французскую музыку не зависимо от жанра. Вот тут то и вся проблемность древовидной структуры папок вылазит. Можно конечно, как советовали на форумах, создавать отдельные папки под язык произведения и кидать ссылки, но опяяяттть папкии..

А вот, что произойдет, если каждому файлу установить теги с жанром, языком, ну и конечно что это музыка, песня.

В этом случае возможно группировать, сортировать музыку гораздо гибче. Например скомбинировав 3 тега: французская, русская, рок можно получить то, чего стандартными средствами Windows не возможно, ну или я чего-то не знаю.

Попытки найти готовое решение.

Первой идеей было воспользоваться «тегированием» файлов, папок. Таким образом можно искать информацию комбинируя теги, не зависимо от порядка слов. И лучшими приложениями для этого, могу выделить XYplorer и Tagging for windows. Первая из себя представляет отдельный файловый менеджер с опцией тегирования. Второе приложение — дополнение к стандартному файловому менеджеру.

Однако они позволяют искать файлы только на ПК и конечно нельзя написать как в Гугл поисковике запрос близкий к пользователю, а алгоритм уже бы сам выбрал из запроса теги и отсортировал информацию по приоритету. В последствии удалил обе, они подвисали и крашились частенько (возможно дело в моих надстройках Windows, не хочу делать антипиар этих отличных программ).

Визуальный поиск

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

Но как вы, наверное, понимаете долго это продолжаться не могло. В конечном итоге я стал задумываться а к какой информации относится это изображение : «Рельсы означает адреса знакомых или желаемые места для путешествия..». Ну а уж то, что под одним изображением образуется портянка из информации без возможности вложенности — это фиаско, бро.

Источник: vc.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru