В современном мире эзотерических услуг всё чаще встречаються специалисты‚ рекламирующие себя через телефонные номера. Для быстрого и точного поиска таких контактов удобно использовать Elasticsearch – мощный поисковый движок с гибкой системой анализа и индексирования данных. В данной статье мы рассмотрим‚ как построить эффективный поиск по номерам телефонов гадалок‚ какие настройки маппинга и анализаторы понадобятся‚ а также как интегрировать результаты с популярными OSINT‑инструментами.
Почему именно Elasticsearch?
- Скорость – поиск по миллионам записей занимает доли секунды.
- Гибкость анализа – можно задать собственные токенизаторы и фильтры для приведения номеров к единому формату.
- Поддержка плагинов – существует готовый плагин
elasticsearch-phone‚ основанный на Google libphonenumber. - Лёгкая интеграция – данные можно получать из MS SQL‚ CSV‚ веб‑скраперов (LetsExtract‚ PhoneInfoga) и сразу отправлять в кластер.
Подготовка исходных данных
Перед индексацией необходимо привести телефонные номера к одному виду. Типичные источники:
- Экспорт из MS SQL (поля: ФИО‚ номер‚ заметка).
- Выгрузка из OSINT‑сервисов (PhoneInfoga‚ Getcontact).
- Скрапленые данные с сайтов и форумов эзотерической тематики (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).
Следуя рекомендациям по настройке кластера и обеспечению безопасности‚ вы сможете построить надёжный и быстрый поисковый сервис‚ который станет незаменимым инструментом для эзотерических практиков‚ маркетологов и аналитиков‚ работающих с телефонными базами данных.
Автор: ваш помощник по поиску и анализу данных.