Цель статьи – показать пошагово‚ как спроектировать и реализовать фильтр поиска‚ который будет находить бесплатные услуги экстрасенсов‚ тарологов и астрологов в интернете․ Мы разберём всё от сбора данных до вывода результатов пользователю‚ используя современные инструменты (Elasticsearch‚ MySQL‚ JavaScript) и учитывая особенности SEO‑оптимизации․
Что такое фильтр поиска и зачем он нужен?
Фильтр поиска – это набор критериев‚ по которым пользователь может сузить список найденных страниц․ В контексте бесплатных экстрасенсов фильтр позволяет:
- Отделить бесплатные консультации от платных․
- Выбрать тип услуги (чат‚ видеосвязь‚ телефон)․
- Указать язык общения‚ регион‚ специализацию (любовные вопросы‚ карьерный рост‚ здоровье)․
- Отсортировать по рейтингу‚ количеству положительных отзывов и дате последнего обновления․
Анализ рынка бесплатных экстрасенсов
Перед тем как писать код‚ необходимо понять‚ какие сайты уже предлагают такие услуги и какие данные они публикуют․ По результатам быстрых поисков (см․ информацию из интернета) можно выделить основные источники:
- Astro7․su – каталог с фильтрами и бесплатным тестом подбора․
- Ezochat․com – видеочаты с бесплатными пробными сессиями․
- LiveExpert․org – чат‑консультации 24/7‚ первые вопросы бесплатно․
- Magecam․ru‚ astrology․com․au – отдельные страницы с бесплатными вопросами․
Эти ресурсы используют:
- Текстовые описания услуг․
- Метаданные (title‚ meta description‚ schema․org)․
- Теги в URL (например‚
/free/psychic/)․
Сбор и структурирование данных
Для собственного фильтра понадобится база‚ содержащая минимум следующие поля:
| Поле | Тип | Описание |
|---|---|---|
| id | INTEGER | Уникальный идентификатор записи․ |
| name | VARCHAR | Имя экстрасенса / название сервиса․ |
| url | VARCHAR | Ссылка на страницу с услугой․ |
| price_type | ENUM(‘free’‚’paid’) | Тип цены (бесплатно/платно)․ |
| service_type | SET(‘chat’‚’video’‚’phone’‚’email’) | Доступные каналы общения․ |
| specialization | SET(‘love’‚’career’‚’health’‚’spiritual’) | Тематика консультаций․ |
| rating | DECIMAL(2‚1) | Средний рейтинг (по отзывам)․ |
| reviews_count | INTEGER | Количество отзывов․ |
| last_update | DATETIME | Дата последнего обновления информации․ |
| language | VARCHAR | Язык общения (ru‚ en‚ etc)․ |
Сбор данных можно выполнить двумя способами:
- Парсинг открытых страниц (web‑scraping)․ При этом важно соблюдать robots․txt и правила использования контента․
- API‑интеграция с сервисами‚ которые предоставляют открытый JSON‑feed (например‚ некоторые каталоги используют
https://api․example․com/psychics?free=1)․
Выбор технологии для поискового индекса
Для быстрого и гибкого фильтрования рекомендуется использовать полнотекстовый движок:
- Elasticsearch – масштабируемый‚ поддерживает агрегации‚ фасетный поиск и сложные запросы․
- Apache Solr – аналог Elasticsearch‚ но с более традиционной конфигурацией․
- Если проект небольшой‚ можно обойтись MySQL + FULLTEXT и динамическим построением WHERE‑условий․
Создание индекса и семантической разметки
Ниже – пример создания индекса в Elasticsearch (версии 8․x):
PUT /psychics
{
"mappings": {
"properties": {
"name": { "type": "text"‚ "analyzer": "russian" }‚
"url": { "type": "keyword" }‚
"price_type": { "type": "keyword" }‚
"service_type": { "type": "keyword" }‚
"specialization": { "type": "keyword" }‚
"rating": { "type": "float" }‚
"reviews_count": { "type": "integer" }‚
"last_update": { "type": "date" }‚
"language": { "type": "keyword" }
}
}
}
После создания индекса загрузите в него данные (пример на Python):
import json‚ requests
with open('psychics․json') as f:
data = json․load(f)
bulk_body = ''
for doc in data:
bulk_body += json․dumps({ "index": { "_index": "psychics"‚ "_id": doc["id"] } }) + '
'
bulk_body += json․dumps(doc) + '
'
resp = requests․post('http://localhost:9200/_bulk'‚ data=bulk_body‚
headers={'Content-Type': 'application/x-ndjson'})
print(resp․json)
Реализация пользовательского интерфейса фильтра
<h2>Подобрать бесплатного экстрасенса</h2>
<form id=»filterForm»>
<label>
<input type=»checkbox» name=»price_type» value=»free» checked> Бесплатно
</label>
<label>Тип услуги:</label>
<select name=»service_type»>
<option value=»»>Любой</option>
<option value=»chat»>Чат</option>
<option value=»video»>Видеосвязь</option>
<option value=»phone»>Телефон</option>
</select>
<label>Тематика:</label>
<select name=»specialization»>
<option value=»»>Любая</option>
<option value=»love»>Любовные вопросы</option>
<option value=»career»>Карьера</option>
<option value=»health»>Здоровье</option>
</select>
<button type=»submit»>Найти</button>
</form>
<div id=»results»></div>
<script>
document․getElementById(‘filterForm’)․addEventListener(‘submit’‚ async e => {
e․preventDefault;
const form = e․target;
const params = new URLSearchParams(new FormData(form));
const query = {
«bool»: {
«must»: [
{«term»: {«price_type»: «free»}}
]‚
«filter»: []
}
};
if (params․get(‘service_type’)) {
query․bool․filter․push({«term»: {«service_type»: params․get(‘service_type’)}});
}
if (params․get(‘specialization’)) {
query․bool․filter․push({«term»: {«specialization»: params․get(‘specialization’)}});
}
const resp = await fetch(‘/search’‚ {
method: ‘POST’‚
headers: {‘Content-Type’: ‘application/json’}‚
body: JSON․stringify({query})
});
const data = await resp․json;
const container = document․getElementById(‘results’); `<div class=»card»>
<a href=»${hit․_source․url}» target=»_blank»>${hit․_source․name}</a>
<p>Рейтинг: ${hit․_source․rating} (${hit․_source․reviews_count} отзывов)</p;
</div>`)․join(»);
});
</script>
Для продакшн‑версии рекомендуется добавить:
- Пагинацию (from/size или
search_after)․ - Кеширование часто используемых запросов (Redis‚ Varnish)․
- Защиту от DDoS и ограничение количества запросов (rate‑limiting)․
Тестирование и оптимизация
- Unit‑тесты для API‑эндпоинтов (pytest‚ mocha)․
- Load‑тесты (k6‚ JMeter) – убедиться‚ что система выдерживает 100‑200 запросов в секунду․
- Анализ логов запросов в Elasticsearch: использовать
profile APIдля поиска «тяжёлых» фильтров․ - Оптимизировать агрегации (использовать
keywordвместоtextдля фасетных фильтров)․
SEO и продвижение собственного каталога
Чтобы ваш сервис появлялся в поисковых системах‚ следует:
- Разметить каждую страницу экстрасенса Schema․org тип
Person+Serviceс атрибутамиpriceSpecification(указатьprice = 0)․ - Создать чистый URL вида
/free/psychic/chat/love/– поисковые роботы легче индексируют такие структуры․ - Сгенерировать XML‑карту сайта и отправить её в Яндекс․Вебмастер и Google Search Console․
- Регулярно обновлять мета‑теги (title‚ description) с включением ключевых фраз: «бесплатный экстрасенс онлайн»‚ «бесплатный чат‑гадание»‚ «бесплатные консультации ясновидящих»․
<html lang=»ru»>
<head>
<meta charset=»UTF-8″>
<title>Бесплатные экстрасенсы онлайн – подборка 2026</title>
<meta name=»description» content=»Список бесплатных экстрасенсов‚ ясновидящих и тарологов․ Фильтры по типу общения‚ специализации и рейтингу․»>
<link rel=»stylesheet» href=»styles․css»>
</head>
<body>
<h1>Бесплатные экстрасенсы онлайн</h1>
<section id=»filters»>
<!— сюда вставляем форму из пункта 6 —>
</section>
<section id=»results»>
<!— результаты будут подставлены скриптом —>
</section>
</body>
Часто задаваемые вопросы (FAQ)
Нужно ли платить за использование Elasticsearch?
Elasticsearch имеет бесплатную Open‑Source версию‚ которую можно развернуть на собственном сервере․ Для облачных решений (Elastic Cloud) есть платные тарифы‚ но для небольшого каталога достаточно бесплатного плана․
Как обеспечить актуальность данных?
Настройте cron‑задачу (или systemd timer)‚ которая будет запускать парсер каждые 12‑24 часа и обновлять записи в индексе․ При изменении цены с «free» на «paid» необходимо переиндексировать только затронутые документы․
Можно ли добавить оплату за премиум‑размещение в каталоге?
Да․ Добавьте поле is_premium и используйте его в сортировке: сначала показывать платные «премиум»‑записи‚ а затем бесплатные․ При этом не меняйте фильтр price_type=free‚ чтобы пользователь мог явно искать только бесплатные услуги․
Как избежать спама и недобросовестных провайдеров?
Внедрите систему модерации и отзывов․ При регистрации нового экстрасенса требуйте подтверждение e‑mail и/или телефон․ Автоматически проверяйте наличие robots․txt у источника‚ откуда берёте данные․
Удачной разработки! Если возникнут вопросы – оставляйте комментарии‚ будем разбирать детали․