Построение эффективного поиска по номерам телефонов гадалок с помощью Elasticsearch

Гайд по настройке Elasticsearch для OSINT-поиска номеров эзотериков. Маппинг, анализаторы и интеграция инструментов — находим контакты мгновенно.

В современном мире эзотерических услуг всё чаще встречаються специалисты‚ рекламирующие себя через телефонные номера. Для быстрого и точного поиска таких контактов удобно использовать Elasticsearch – мощный поисковый движок с гибкой системой анализа и индексирования данных. В данной статье мы рассмотрим‚ как построить эффективный поиск по номерам телефонов гадалок‚ какие настройки маппинга и анализаторы понадобятся‚ а также как интегрировать результаты с популярными OSINT‑инструментами.


Почему именно Elasticsearch?

  • Скорость – поиск по миллионам записей занимает доли секунды.
  • Гибкость анализа – можно задать собственные токенизаторы и фильтры для приведения номеров к единому формату.
  • Поддержка плагинов – существует готовый плагин elasticsearch-phone‚ основанный на Google libphonenumber.
  • Лёгкая интеграция – данные можно получать из MS SQL‚ CSV‚ веб‑скраперов (LetsExtract‚ PhoneInfoga) и сразу отправлять в кластер.

Подготовка исходных данных

Перед индексацией необходимо привести телефонные номера к одному виду. Типичные источники:

  1. Экспорт из MS SQL (поля: ФИО‚ номер‚ заметка).
  2. Выгрузка из OSINT‑сервисов (PhoneInfoga‚ Getcontact).
  3. Скрапленые данные с сайтов и форумов эзотерической тематики (LetsExtract).

Пример записи в JSON‚ готовой к индексации:

{
 "full_name": "Иванова Мария Сергеевна"‚
 "phone_raw": "+7 (495) -23-45-67"‚
 "note": "Гадает на Таро‚ принимает звонки с 10:00 до 20:00"‚
 "tags": ["гадалка"‚ "таро"‚ "эзотерика"]
}

Поле phone_raw будет хранить исходный ввод‚ а после обработки анализатором появится нормализованное поле phone_norm.


Маппинг и анализ номеров телефонов

Базовый маппинг

PUT phone_galaktika
{
 "mappings": {
 "properties": {
 "full_name": { "type": "text"‚ "analyzer": "standard" }‚
 "phone_raw": { "type": "keyword" }‚
 "phone_norm": { 
 "type": "keyword"‚ 
 "normalizer": "phone_normalizer" 
 }‚
 "note": { "type": "text"‚ "analyzer": "russian" }‚
 "tags": { "type": "keyword" }
 } }‚
 "settings": {
 "analysis": {
 "normalizer": {
 "phone_normalizer": {
 "type": "custom"‚
 "filter": ["lowercase"‚ "asciifolding"‚ "phone_number_filter"]
 }
 }‚
 "filter": {
 "phone_number_filter": {
 "type": "pattern_replace"‚
 "pattern": "[\s\-\(\)]+"‚
 "replacement": ""
 }
 } }
 }
}

Этот маппинг:

  • удаляет пробелы‚ скобки и дефисы (pattern_replace)‚
  • приводит к нижнему регистру и удаляет диакритические знаки (lowercase‚ asciifolding)‚
  • сохраняет результат в phone_norm как keyword (точное совпадение).

Использование плагина elasticsearch-phone

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

bin/elasticsearch-plugin install https://github;com/purecloudlabs/elasticsearch-phone/releases/download/v1.0.0/elasticsearch-phone-1.0.0.zip

После установки можно добавить специализированный анализ:

PUT phone_galaktika
{
 "settings": {
 "analysis": {
 "analyzer": {
 "phone_analyzer": {
 "tokenizer": "standard"‚
 "filter": [
 "lowercase"‚
 "phone_number_token_filter"
 ]
 }
 }‚
 "filter": {
 "phone_number_token_filter": {
 "type": "phone_number"‚
 "default_region": "RU"‚
 "lenient": true
 }
 }
 }
 }‚
 "mappings": {
 "properties": {
 "phone_raw": { "type": "text"‚ "analyzer": "phone_analyzer" }‚
 "phone_country": { "type": "keyword" }‚
 "phone_operator": { "type": "keyword" }‚
 "phone_type": { "type": "keyword" }
 }
 }
}

Плагин автоматически заполняет дополнительные поля (phone_country‚ phone_operator‚ phone_type) на основе номера‚ что крайне полезно для эзотериков‚ желающих знать‚ из какого региона звонит гадалка.


Техники поиска по номерам

Точное совпадение

Если известен полный номер в международном формате:

GET phone_galaktika/_search
{
 "query": {
 "term": {
 "phone_norm": "+7 -951234567"
 }
 }
}

Поиск по префиксу (код страны/оператора)

GET phone_galaktika/_search
{
 "query": {
 "prefix": {
 "phone_norm": "+7"
 }
 }
}

Поиск по суффиксу (последние цифры)

Elasticsearch не поддерживает суффиксный поиск напрямую‚ но можно использовать reverse token filter или хранить обратную строку:

PUT phone_galaktika
{
 "settings": {
 "analysis": {
 "analyzer": {
 "reverse_phone": {
 "tokenizer": "keyword"‚
 "filter": ["reverse"]
 }

 }
 }
 }‚
 "mappings": {
 "properties": {
 "phone_norm": { "type": "keyword" }‚
 "phone_norm_rev": { 
 "type": "keyword"‚ 
 "normalizer": "reverse_phone" 
 }
 }
 }
}

Запрос:

GET phone_galaktika/_search
{
 "query": {
 "prefix": {
 "phone_norm_rev": "7654321" // обратный вид от "...1234567"
 }
 }
}

Fuzzy поиск (опечатки в номере)

GET phone_galaktika/_search
{
 "query": {
 "fuzzy": {
 "phone_norm": {
 "value": "+7 -95123456"‚
 "fuzziness": 1
 }
 }
 }
}

Регулярные выражения (для сложных шаблонов)

GET phone_galaktika/_search
{
 "query": {
 "regexp": {
 "phone_norm": "^\+7\s?495\s?\d{3}[\s-]?\d{2}[\s-]?\d{2}$"
 }
 }
}

При работе с большими объёмами данных рекомендуется включать fielddata только для keyword‑полей‚ используемых в агрегациях‚ и держать index.prefix.length минимальным‚ чтобы экономить память.


Интеграция с OSINT‑инструментами

PhoneInfoga

phoneinfoga -n +7 -951234567 --json > infoga.json
curl -X POST "localhost:9200/phone_galaktika/_doc/1?refresh" -H 'Content-Type: application/json' -d @infoga.json

Getcontact

Сервис предоставляет метки (например‚ «гадалка»‚ «мошенник»). Полученные теги удобно сохранять в массив tags:

{
 "full_name": "Анна Петрова"‚
 "phone_norm": "+7 -031234567"‚
 "tags": ["гадалка"‚ "астрология"‚ "проверено Getcontact"]
}

LetsExtract

Инструмент извлекает номера с веб‑страниц‚ форумов и соцсетей. После парсинга получаем CSV‚ который можно загрузить через Logstash или ingest‑pipeline:

input {
 file {
 path => "/tmp/letsextract_phones.csv"
 start_position => "beginning"
 sincedb_path => "/dev/null"
 }
}
filter {
 csv {
 separator => "‚"
 columns => ["full_name"‚"phone_raw"‚"note"]
 }
 ruby {
 code => "
 require 'phonelib'
 event.set('phone_norm'‚ Phonelib.parse(event.get('phone_raw')).full_international)
 "
 }
}
output {
 elasticsearch {
 hosts => ["localhost:9200"]
 index => "phone_galaktika"
 document_id => "%{uuid}"
 }
}

Пример полного ingest‑pipeline для гадалок

PUT _ingest/pipeline/phone_galaktika_pipeline
{
 "description": "Подготовка данных о гадалках для поиска по телефону"‚
 "processors": [
 {
 "lowercase": { "field": "full_name" }
 }‚
 {
 "gsub": {
 "field": "phone_raw"‚
 "pattern": "[\s\-\(\)]+"‚
 "replacement": ""
 }
 }‚
 {
 "set": {
 "field": "phone_norm"‚
 "value": "{{phone_raw}}"
 } }‚
 {
 "phone_number": {
 "field": "phone_raw"‚
 "target_field": "phone_meta"‚
 "default_region": "RU"
 } }‚
 {
 "set": {
 "field": "phone_country"‚
 "value": "{{phone_meta.country_code}}"
 }
 }‚
 {
 "set": {
 "field": "phone_operator"‚
 "value": "{{phone_meta.national_number}}"
 }
 }
 ]
}

Индексирование с использованием пайплайна:

POST phone_galaktika/_doc?pipeline=phone_galaktika_pipeline
{
 "full_name": "Мария Иванова"‚
 "phone_raw": "+7 (495) -23-45-67"‚
 "note": "Гадает на рунах‚ работает круглосуточно"
}

Рекомендации по производительности и безопасности

  • Шардирование – для индекса с несколькими миллионами записей оптимально 3‑5 первичных шардов и 1 реплика.
  • Кеширование фильтров – используйте filter вместо query там‚ где не нужен score.
  • Ограничение доступа – включите роль read_only для клиентов‚ которым нужен только поиск.
  • Аудит – включите xpack.security.audit.enabled для отслеживания запросов по номерам.
  • Обезличивание – если данные содержат личную информацию‚ рассмотрите маскировку последних двух цифр в поле phone_raw для публичных запросов.

Поиск по номерам телефонов гадалок в Elasticsearch – это сочетание правильного маппинга‚ использования специализированных анализаторов (включая плагин elasticsearch-phone) и интеграции с OSINT‑инструментами. Приведённые выше техники позволяют:

  • приводить любые варианты ввода к единому нормализованному формату;
  • выполнять мгновенное точное‚ префиксное‚ фуззи иregex‑поиск;
  • обогащать записи метаданными о стране‚ операторе и типе линии;
  • быстро получать контекстную информацию из внешних сервисов (PhoneInfoga‚ Getcontact‚ LetsExtract).

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


Автор: ваш помощник по поиску и анализу данных.