Как создать поисковую систему в интернете

от admin

Как настроить свою поисковую систему. Пошаговое руководство

Рассказываю про инструмент, который позволит искать в интернете быстрее всех и легко находить то, что нужно. Речь о программируемой поисковой строке от Google. Мы создадим систему поиска по документам, а в конце поделюсь своими универсальными панелями.

Programmable Search Engine (PSE) или программируемая поисковая строка — это надстройка в Google, которая позволяет каждому сделать свою уникальную систему поиска.

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

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

Выполним следующие шаги:

1. Заходим в свой аккаунт в Google

2. Переходим на сайт -> Начать

3. Выбираем название для своей системы, в моем примере это «Documents», нажимаем «Поиск во всем интернете», проходим Captcha -> Создаем

4. Систему создали, надо ее настроить

5. Заходим в меню в «Функции в результатах поиска», затем в «Уточнения результатов поиска». Это самый важный пункт, здесь будем настраивать уточнения для фильтрации поиска.
Первое назовем PDF по типу нужных файлов.
При создании каждого уточнения у нас есть две опции на выбор:
— либо «Искать на сайтах с этим уточнением», тогда в выдачу не будут добавляться другие сайты;
— либо «Изменить приоритет показа сайтов с этим уточнением». Здесь можно задавать «веса» (приоритет) показу определенных сайтов, но и могут появляться другие сайты при минимальном совпадении с запросом. Ставим «1», то есть дадим самый высокий приоритет.
В поле «Дополнительно» введем оператор
ext:pdf

Это позволит ограничить выдачу только типом файлов PDF. Сохраняем уточнение.
По аналогии создадим уточнения для остальных типов файлов. Всего у нас будет восемь типов, каждый будет показываться в отдельной вкладке, это удобно.
Назовем DOC, зададим приоритет показа и введем в поле «Дополнительно» операторы поиска
ext:doc OR ext:docx

Таким образом мы создали еще одну вкладку в результатах, где увидим документы Microsoft Word старого (doc) и нового (docx) форматов.
Создадим остальные уточнения:
Таблицы XLS (Excel Spreadsheets) -> ext:xls OR ext:xlsx OR ext:csv

Презентации PPT (PowerPoint Files) -> ext:ppt OR ext:pptx

TXT (Text Docs) -> ext:txt OR ext:rtf

WPD (Word Perfect Docs) -> ext:wpd

ODT (OpenOffice Docs) -> ext:odt OR ext:ods OR ext:odp

ZIP (Compressed Files) -> ext:zip OR ext:rar OR ext:7z

6. Наша система готова. Она ищет по разным типам документов, находит старые и новые версии файлов, показывает в отдельных вкладках разные типы файлов, делает сортировку по релевантности и дате. Вот так она выглядит:

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

В строке не забывайте добавлять “ ” для поиска точного соответствия.

Вот еще две универсальные системы для ежедневного использования:
Поиск видео по самым популярным хостингам и стриминговым площадкам.Есть возможность искать в Архиве Интернета, на локальных видео-хостингах по странам. В общем, можно найти много интересного.

Здесь, кроме поиска по имени и фамилии (можно в кавычках), не забываем использовать спец. символы хэштег # и юзернейм @. Также доступен поиск по фото.

В примере мы рассмотрели первые простые шаги, а развитие этой темы имеет большой потенциал: мы можем создавать действительно уникальные инструменты.
— поиск по фото, тогда в уточнениях зададим типы файлов jpg, jpeg, png, bmp, gif;
— поиск товаров на торговых площадках: Amazon, Ebay;
— поиск по сервисам видео-игр;
— поиск по сайтам с обзорами и отзывами: TripAdvisor, Google Reviews, Airnbnb;
— поиск бизнес-информации по компании;
— отслеживание появления файлов, которые появляются на одном или нескольких доменах компании.

— изучите поисковые операторы, они сделают инструмент еще точнее. Вот так я настраивала поиск видео на сайте Архива Интернета с помощью операторов.

Как создать свой поисковик и возможно ли это сделать самостоятельно?

Как создать свой поисковик и создать конкуренцию известным «поисковым гигантам»

  1. Пользовательский интерфейс.

  2. Базы данных с сайтами для их индекса.

  3. Поисковый робот, который будет обходить сайты и обновлять /добавлять информацию о них в базу данных.

  • нанять высококвалифицированных специалистов и организовать им рабочее пространство;

  • оборудовать собственный дата-центр или арендовать мощности у надежной компании;

  • быть готовым в течение нескольких лет терпеть убытки.

Как создать небольшой локальный поисковик на своем сайте

  • удобство поиска для ваших клиентов;

  • дополнительный способ монетизации вашего проекта;

  • много плюсов к вашему престижу, брендингу и узнаваемости.

Заключение

Теперь вы знаете, как можно создать свой поисковик. Если это будет глобальная поисковая система, то к этому нужно подготовит ь ся финансово и морально. Если локальный поисковик на собственном сайте, то самый простой способ — это использовать готовое решение. При этом если вы с программированием на «ты», то для вас не составит труда создать свой собственный поисковик с нуля.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Как сделать поисковую систему с ИИ, используя FastAPI, Qdrant и ChatGPT

Из-за шумихи вокруг Bing AI и Bard у меня возникло желание создать свою маленькую поисковую систему с искусственным интеллектом. Повозившись несколько дней, я выпустил Ask Seneca. Это небольшое приложение на основе GPT, с помощью которого можно поболтать с Сенекой (это древнеримский философ, если что). Когда пользователь задаёт вопрос, Ask Seneca ищет наиболее релевантные записи, а затем объединяет их в связный ответ, иногда вставляет известные высказывания своего прообраза.

Несмотря на косяки, которыми грешат Bing AI и Bard, потенциал этой технологии огромен — вы можете создавать инструменты для быстрого и эффективного поиска в юридических документах, внутренних базах знаний, руководствах по продуктам и т. д.

Я покажу, как создать собственную поисковую систему с искусственным интеллектом на основе FastAPI , Qdrant , Sentence Transformers и GPT-3. Вы сможете задавать вопросы Марку Аврелию и получать краткие ответы со ссылками на его «Размышления» (личные записи великого римского императора).

Что нужно знать

Чтобы создать свой мини-поисковик, нужно разбираться в следующих вопросах:

Что такое FastAPI и как его использовать.

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

Разработка (крошечной) поисковой системы с помощью ChatGPT

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

Извлечение: Здесь происходит извлечения данных, которые будут доступны пользователю для поиска. В нашем случае это означает разбор Размышлений Марка Аврелия. Я не буду вдаваться в подробности, потому что это узкая специфика проекта. Готовый парсинг данных доступен в репозитории.

Индексирование: Следом необходимо выполнить индексирование извлеченных данных, чтобы к ним можно было получить доступ позже в процессе поиска. Здесь будет использоваться подход семантического поиска, то есть данные будут искаться по смыслу, а не по ключевым словам. То есть, на поисковый запрос «Как стать счастливым?» вы должны получить отрывки из «Размышлений», где говорится о счастье или хорошем самочувствии, а не только те, в которых содержатся точные слова из запроса.

Поиск: Сюда входит серверная служба, которая обрабатывает запрос пользователя, векторизует его, находит в индексе векторы, наиболее похожие на него, а затем вызывает API OpenAI для создания сводного ответа пользователю.

Вот как части приложения сочетаются друг с другом:

Настройте свою локальную среду

Выполните следующие действия, чтобы подготовить локальную среду:

Установить Poetry. Это не обязательно, но я очень рекомендую.

Клонируйте репозиторий с образцом приложения:

git clone https://github.com/dylanjcastillo/ai-search-fastapi-qdrant-chatgpt

Перейдите в корневую папку проекта и установите зависимости с:

Poetry: Создайте виртуальную среду в том же каталоге, что и проект, и установите зависимости:

poetry config virtualenvs.in-project true

venv и pip: Создайте виртуальную среду и установите зависимости, перечисленные в разделе:

python3.10 -m venv .venv && source .venv/bin/activate

pip install -r requirements.txt

Имейте в виду, что PyTorch пока не поддерживает Python 3.11 в MacOS и Windows.

Если все прошло успешно, у вас должна получиться виртуальная среда со всеми необходимыми библиотеками и структурой проекта, которая выглядит следующим образом:

Это структура нашего проекта. Далее объясню назначение наиболее важных файлов и каталогов:

config.py : этот файл содержит спецификации конфигурации проекта, такие как хост Qdrant, порт и ключ API (чтение из файла .env).

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

main.py : этот файл содержит код приложения FastAPI.

notebooks/ : этот каталог содержит записные книжки Jupyter для извлечения, векторизации и индексации данных. extract_text.ipynb содержит код для анализа файла HTML, а vectorize_text.ipynb содержит код для векторизации и индексации данных.

poetry.lock и pyproject.toml : эти файлы содержат информацию о зависимостях проекта и используются Poetry для репликации среды.

requirements.txt : этот файл содержит список пакетов Python, необходимых для проекта.

.env-example : этот файл является примером переменных среды, которые вы должны предоставить.

.venv/ : этот каталог содержит виртуальную среду проекта.

Настройте Qdrant и OpenAI

Начнём с переименования .env-example в .env. Сейчас думать о заполнении значений в .env. не нужно. Когда вы создадите кластер и ключи API для Qdrant и OpenAI, то заполните эти пробелы.

Qdrant

Создайте учётную запись в Qdrant, если у вас её ещё нет. Затем на странице своей учётной записи перейдите в Clusters > Create и создайте кластер из 1 ГБ ОЗУ, 0,5 vCPU и диска на 20 ГБ. Qdrant предлагает щедрый тестовый доступ, так что вы можете бесплатно запустить кластер с такими характеристиками.

Затем вставьте хост и ключ API, полученные при создании кластера, в .env :

Если вы не копировали ключ, то можете создать новый в Access.

Наконец, вы можете проверить, всё ли хорошо, запустив первые три ячейки в файле vectorize_data.ipynb .

OpenAI

Если у вас нет учетной записи OpenAI, создайте ее (а вот инструкция для россиян). После этого перейдите в Manage account > API keys > + Create new secret key.

Затем вставьте сгенерированный ключ в .env :

Извлечение данных

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

Вот несколько полезных рекомендаций, которые стоит учесть:

Хрень на входе — хрень на выходе. Качество данных сильно влияет на результаты поиска, поэтому не торопитесь.

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

Вывод: стоит подумать, как часто вы будете извлекать и принимать данные, адаптировать свой конвейер для различных источников данных (например, парсинг, API) и создавать мониторы конвейера. В этом примере, поскольку извлечение данных является разовым мероприятием, я использую Jupyter Notebook, но это не всегда хорошая идея.

Вот краткий обзор данных из этого блока:

Сюда входят общие метаданные, такие как название книги и исходный URL-адрес, а также информация из каждой главы с предложениями, которые вы индексируете. Если вы хотите посмотреть, как я извлёк данные, используемые в этом руководстве, ознакомьтесь с файлом extract_data.ipynb.

Векторизация и индексация данных

После того, как вы извлекли данные, их нужно проиндексировать в векторной базе данных.

Процесс состоит из двух шагов:

Создайте векторы для каждого предложения, которое было извлечено ранее.

Вставьте эти векторы в коллекцию (набор векторов, который вы можете искать в базе данных).

Вы можете найти код для этого раздела в notebooks/vectorize_data.ipynb .

Как обычно, начинаем с импорта необходимых библиотек:

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

qdrant_client и qdrant_client.http позволяет взаимодействовать с клиентом Qdrant, чтобы вставлять и извлекать данные из коллекции.

sentence_transformers позволяет генерировать векторы из текста, используя предварительно обученные модели.

Далее данные читаются следующим образом:

Этот код считывает ранее обработанные данные и удаляет короткие предложения. Работает это следующим образом:

Строки с 1 по 4 читают файл JSON, созданный вами для “Размышлений”, и сохраняют его как meditations_json.

Строки с 6 по 15 проходят через все главы книги, хранящиеся в data от meditations_json , после чего для каждой главы извлекают соответствующие данные (название главы, URL-адрес главы и предложение) и добавляют их в rows.

Строки с 17 по 21 создают DataFrame с данными rows и удаляют предложения, содержащие менее 15 слов.

Затем вы создаете коллекцию в базе данных векторов:

Этот код подключается к вашему кластеру Qdrant и создает коллекцию на основе предоставленных имени и параметров. В этом случае вы устанавливаете значение size384 в зависимости от потребностей модели, которую будете использовать для векторизации предложений. Вы также устанавливаете distance, чтобы использовать косинусное расстояние, которое будет определять, как вычисляется сходство между векторами.

Следующим шагом является создание векторов (эмбеддингов) из текста. Вместо эмбеддингов на основе OpenAI вы будете использовать предварительно обученную модель из Sentence Transformers. OpenAI дороже, но не факт, что лучше.

Для этого нужно загрузить предварительно обученную модель, создать вложения из предложений DataFrame и вставляете их в созданную вами коллекцию:

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

Строки с 1 по 8 загружают модель преобразователя предложений msmarco-MiniLM-L-6-v3 и устанавливают правильное устройство, если у вас есть доступный графический процессор.

Строки с 10 по 23 генерируют массив векторов, используя загруженную вами модель. Каждый вектор представляет собой числовое представление предложений из DataFrame.

Строки с 29 по 43 вставляют векторы и дополнительные данные (фактическое предложение, название книги и главы и URL-адрес) в коллекцию базы данных векторов.

Читать:
Как сделать подложку в пдф

Создание сервера с FastAPI

Далее нужно создать приложение FastAPI, которое позволит пользователю взаимодействовать с векторной базой данных и ChatGPT. Код для этого раздела находится в формате main.py .

Начинаем с импорта необходимых зависимостей, настройки клиента Qdrant и загрузки модели:

Этот код импортирует библиотеки и параметры конфигурации, инициализирует клиент Qdrant и загружает модель в память (ту, которую использовали для векторизации предложений). Вы загружаете свою модель глобально, иначе придётся загружать её каждый раз, когда кто-то задаёт вопрос. Это сильно замедлит запросы.

Затем вы определяете функцию, которая поможет при создании подсказок для ChatGPT, по которым он будет генерировать последовательный ответ на основе наиболее подходящих отрывков из «Размышлений»:

Этот код включает подсказку для ChatGPT, которая заставляет его «имитировать» Марка Аврелия, отвечающего на заданный пользователем вопрос, со списком ссылок, ранее полученных из векторной базы данных. Программа возвращает сгенерированный ответ и список ссылок.

Затем вы создаете две конечные точки:

Это две конечные точки, которые вы будете использовать в своем приложении. Вот что делает каждая строка:

Строки с 1 по 5 устанавливают конечную точку, которая принимает запросы GET на «/». Она возвращает ответ в формате JSON с ключом сообщения, где пользователю предлагается использовать конечную точку «/ask».

Строки с 8 по 17 определяют конечную точку, которая принимает запросы POST на «/ask» с одним параметром question типа string. Как только пользователь отправит запрос, вы векторизуете вопрос, используя модель, которую вы загрузили ранее, затем получаете 3 наиболее похожих документа из вашей векторной базы данных.

Строки с 19 по 32 объединяют документы, которые вы получили из векторной базы данных, с вашей подсказкой и делают запрос к API ChatGPT. Вы устанавливаете max_tokens=250 , чтобы ответы были короткими, и устанавливаете temperature=0.2 , чтобы модель не несла отсебятину. Наконец, вы извлекаете ответ из ответа API ChatGPT и возвращаете его пользователю вместе со ссылками.

Если вы хотите протестировать его локально, введите следующую команду в терминал (внутри виртуальной среды проекта):

В браузере перейдите к localhost:8000/docs, чтобы проверить конечную точку /ask:

Хороший ответ будет выглядеть следующим образом:

Вот и все! У вас есть рабочая версия поисковой системы с искусственным интеллектом.

Существует множество различных способов развёртывания приложения, поэтому вы можете выбрать любой подход, который вам больше нравится. Мне нравится VPS с NGINX, выступающим в качестве обратного прокси-сервера, и Gunicorn в качестве диспетчера процессов с рабочими процессами Uvicorn. Если вы хотите использовать такой же подход, посмотрите моё руководство.

И помните о следующих моментах:

Вы должны использовать —preload, если хотите брать одну и ту же модель для всех процессов и использовать меньше оперативной памяти.

При обслуживании некоторых типов моделей возникают проблемы с утечкой памяти. У меня получилось обойти это, установив низкие значения —max-requests и —max-requests-jitter.

Весь код для этого туториала доступен на GitHub. Спасибо за внимание!

Как и зачем я создал свой поисковик Pick: история создания и примеры кода

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

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

Название мы с друзьями выбрали созвучно всем известной Picus Networks из мира компьютерной игры DeusEx. Осталось создать два алгоритма Pick для выполнения запросов и Picker для индексации контента.

Как создавался Pick

Можно было реализовать поисковую систему отдельно, но я использовал framework RevolveR, который предоставляет доступ к API работы с базой данных и ее кэширование, обработку POST и GET запросов с защитой, а также fetch API для динамических запросов.

А после интеграции Pick стал частью ядра. Скачать RevolveR CMF можно со страницы проекта GitHub.

Создаем индекс в базе данных

Очевидно, что нам нужен свой поисковый индекс, который будет храниться в базе данных. Для этого сформируем структуру на SBQ (structure based queries), которая хранится в файле /Kernel/Structures/DataBase.php:

Мы создали структуру будущей таблицы revolver_index, которую будут использовать модели для записи и хранения данных. Полям content , description и title назначаем полнотекстовый индекс для ускорения запросов SELECT, а для поля host укажем тип индекса simple (это поможет сделать быстрый поиск по всем индексированным ссылкам определённого ресурса).

Также у нас есть поля date и hash . Дата хранит последний момент индексации ресурса, а hash указывает на актуальность данных (если хэш заново полученной страницы не отличается от хранимого в БД значения, то обновление не выполняется).

Поле uri будет содержать полную ссылку страницы.

Теперь нам понадобится таблица в БД которая будет хранить рейтинги материалов в формате 5 звезд на основе голосов зарегистрированных пользователей (API для рейтингов есть и о том как оно работает чуть ниже).

Создадим еще одну структуру:

Таблица очень простая. Она хранит ID ресурса, ID пользователя и оценку.

Давайте зарегистрируем структуры в схеме базы данных:

Таблицы сформированы и описаны и нам осталось выполнить SBQ через API RevolveR CMF для создания этих таблиц в базе данных:

После выполнения этого кода в базе данных появится таблицы revolver__index и revolver__index_ratings, а мы сможем использовать API моделей для работы с ними.

Регистрируем сервис индексации и страницу поиска

В RevolveR CMF есть такое понятие как сервисы. Они используются для выполнения каких-то задач при обращении к ним с аргументами, но не имеют кэширования и не обрабатываются шаблоном.

Хочу научиться программировать на PHP. С чего начать?

Чтобы зарегистрировать сервис индексации просто пропишем параметры в файл /private/config.php:

Здесь все предельно просто. Type service указывает на то, что URL /picker/ будет служить обработчиком запросов, которые избегают систему кэширования фреймворка и игнорируют формирование шаблона.

Теперь сразу же зарегистрируем путь, который будет отображать страницу выполнения поисковых запросов к базе данных. Для этого в этом же файле добавим строки:

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

Мы зарегистрировали 2 URI и теперь нужно подключить обработчики сервиса и узла. Поскольку было решено сделать Pick компонентом ядра, мы модернизируем файл /Kernel/Modules/Switch.php:

Этими строками мы создали подключение NodePick и RoutePicker, которые будут содержать основные исходные коды алгоритмов поискового движка. Нам достаточно всего 2 файла.

Индексатор URL Picker

Чтобы проиндексировать какой либо сайт мы должны иметь доступ по сети и уметь парсить сайты. Для этого была использована стандартная библиотека cURL для PHP.

Вот исходный код функции, которая открывает URL и достает содержимое страницы:

Работает алгоритм очень просто. При передаче URL происходит открытие web-страницы и обработчик проверяет корректность SSL соединения. Далее мы смотрим что тип документа характеризует ценные для нас данные HTML или Application xHTML, а также проверяем код ответа сервера. Все, что препятствует получению данных приводит к возврату значения null .

Дополнительно проверяем, что отдаваемый сервером контент может быть сжатым в gzip, deflate или compress.

Теперь нам нужна функция для работы с самим полученным документом. Мы должны извлечь текстовое содержимое без тегов и получит все ссылки на странице:

Здесь вы могли заметить еще две вспомогательные функции. Одна из них, getMetaTags() , извлекает из HTML содержимого все мета теги, а другая, getHost() , распаковывает URL и возвращает host .

Исходный код функций получения meta тегов и хоста:

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

Мы собираем только ссылки на этот же ресурс для того, чтобы crawler не убежал слишком далеко, а корректно закончил индексацию всего ресурса.

Поддержка Robots.txt

Не все ссылки бывают полезны и не все страницы несут какую либо смысловую нагрузку. Чтобы профильтровать информацию добавим поддержку подгрузки файла robots.txt:

Загружаем мы robots.txt только единожды за проход и сохраняем полученный массив правил в переменную:

Далее нам понадобится обработчик правил robots.txt. Для этого используем функцию:

При передаче аргумента $xurl происходит сверка с правилами robots.txt и функция возвращает либо true либо null , что символизирует разрешение на добавление в базу данных.

Обработка индекса

Чтобы базу индекса могли индексировать только администраторы и писатели ресурса мы обернем код в проверку роли и добавим фильтр запроса. Черпать аргумент будем из контроллера переменных SV[‘g’] .

Таким образом мы получаем значение host из GET запроса и можем приступить к созданию поискового индекса.

Обработчик индекса поисковой базы

Изначально мы делаем запрос с проверкой наличия искомого URL в базе данных. Если индекс уже существует — просто выясняем свежий ли он, а если его нет, то запишем результат в базу данных. Попутно мы делаем запрос к robots.txt, распаковываем ссылки и метаданные из документов.

Отвечает за это следующая функция:

После записи основной страницы, с которой начинается индексация, происходит обработка всех URL, которые она содержит. Здесь работают две модели:

Модель GET проверяет наличие адреса в индексе.

Модель SET использует автоматическое чтение схемы БД из SBQ и выполняет запрос записи или обновления автоматически.

Алгоритм использует timeout .5 секунды между запросами по ссылкам и не нагружает ресурсы, когда происходит сканирование.

Стоит обратить внимание на hash . В данном случае мы сначала распаковываем тело документа, а затем избавляемся от всех тегов. MD5 полученного текста мы будем использовать для проверки актуальности данных.

Если страницы изменялись, то алгоритм подметит это при проверке:

Для того, чтобы не загружать заново обработанные в процессе прохода ссылки мы передаем аргумент &$indexed по ссылке и на каждую итерацию заполняет глобальный массив ссылками при этом проверяя, что url нет в списке.

Выполняем поисковые запросы

Обладая собственным индексом мы можем приступить к созданию самого сервиса поиска. Для этого мы применим экспертную модель работающую на основе SBQ:

Здесь мы не используем классический LIKE MySQL запрос, а применяем RegExp поиска по базе данных.

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

Сам аргумент qs мы будем брать из контроллера переменных SV[‘p’] (стек POST запросов):

Также в этом коде происходит сверка значения captcha, которая усиливает надёжность и предотвращает спам запросы с удаленных серверов.

Сама форма строится с использованием Form API и ее структура (FS) выглядит следующим образом:

К форме подключен автоматический перевод заголовков полей и меток, а сама структура формы должна быть передана в CLASS:

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

Алгоритм ранжирования

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

Пишем обработку сниппета

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

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

Здесь пришлось повозиться. Простой подход совсем не подразумевал, что PHP начнет обрабатывать UTF-8 корректно, но я смог добиться работы с русским и английским языками.

Это обычный список возможностью выбора одного из 5ти вариантов голосования по шкале звезд. Голосовать мы предоставим возможность только зарегистрированным пользователям не более одно раза за ссыку, что исключит факт накрутки.

Как освоить бэкенд-разработку в 2022 году: дорожная карта

Сам JavaScript для обработки голоса находится в файле /Interface/interface.js и он также подключен к другим материалам подвергаемым голосованию(новости, страницы блога, страницы форума, комментарии и так далее).

Отдельно обратим внимание на обработку голосования. В Revolver CMF уже есть функциональность для голосования и она располагается в сервисе в файле /Kernel/Routes/RouteRating.php.

Нам нужно просто добавить HTML разметку хэндлера для, которая будет инициализировать по клику функцию голосования:

Это обычный список возможностью выбора одного из 5ти вариантов голосования по шкале звезд. Голосовать мы предоставим возможность только зарегистрированным пользователям не более одно раза за ссыку, что исключит факт накрутки.

Сам JavaScript для обработки голоса находится в файле /Interface/interface.js и он также подключен к другим материалам подвергаемым голосованию (новости, страницы блога, страницы форума, комментарии и так далее).

Отдельно обратим внимание на обработку голосования. В Revolver CMF уже есть функциональность для голосования и она располагается в сервисе в файле /Kernel/Routes/RouteRating.php.

Handler голосования автоматически подключается к fetch , а нам осталось только добавить параметр $tpe и прописать таблицу для которой устанавливаются голоса:

Будущее Pick

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

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

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

Здесь найдется и место для нейронной сети, чтобы было интереснее и круче.

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

Скачать дистрибутив RevolveR CMF с поисковой системой Pick можно со страницы проекта GitHub.

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

Похожие статьи