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

Elasticsearch — это поисковый движок на Java, работающий по HTTP-протоколу который позволяет быстро и эффективно обрабатывать огромные объемы данных, предоставляя пользователям возможность находить нужную информацию в считанные секунды.

Эта статья предназначена для тех, кто хочет освоить основы Elasticsearch и научиться использовать его возможности на практике. Мы рассмотрим ключевые концепции, такие как индексы, документы и запросы, а также научимся настраивать окружение и выполнять основные операции. Независимо от того, являетесь ли вы разработчиком, аналитиком или просто хотите расширить свои знания о современных технологиях обработки данных, это руководство поможет вам уверенно шагнуть в мир Elasticsearch. Подготовьтесь к увлекательному путешествию в мир поисковых технологий!

Один из способов использования Elaticsearch - docker файл. Ниже будет прикреплен docker-compose файл для удобства.

Решение возможных проблем с запуском: ограничить потребление ресурсов через опции JVM.

docker-compose
version: "3.8"
services:
  elasticsearch:
    image: elasticsearch:8.6.2
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
  kibana:
    image: kibana:8.6.1
    ports:
      - "5601:5601"

Способы работы с Elasticsearch:

  • Через терминал, с использованием cURL

  • Использование Kibana

  • Использование Dbeaver/DataGrip для подключения

Индексы

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

Документ - запись в индексе, соответствующая схеме данных.

Схема документа - описание данных в полях, тип данных (например, long для чисел, keyword для текста).

Поиск

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

Релевантность документа - оценка соответствия результата поисковому запросу, определяемая используемыми поисковыми алгоритмами.

Фильтрация данных в Elasticsearch: использование классического языка запросов и SQL-синтаксиса.  Альтернативный способ использования SQL: функция translate для перевода SQL-запросов в Elasticsearch DSL.

Полнотекстовый поиск

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

Полнотекстовый индекс состоит из полнотекстовых документов и полнотекстовых полей.

Полнотекстовые документы содержат текст, а полнотекстовые поля содержат информацию о документе.

Bulk-запросы

Bulk-запросы в Elasticsearch позволяют загружать данные пачкой, что ускоряет процесс и снижает нагрузку на сеть и Elasticsearch.

Bulk-запрос состоит из пачки json-объектов, где на нечётных строках повторяется одно и то же, а на последней строке должен стоять символ переноса \n. Elasticsearch возвращает JSON-ответ с информацией о сохранённых документах и возможных ошибках.

Если в процессе сохранения возникли ошибки, можно составить запрос на сохранение с параметром filter_path=items.*.error.

Практика

Блок создания индекса

Создание индекса
PUT favorite_films

Блок внесения данных

Внесение данных с заранее внесенным индексом
POST favorite_films/_doc/1
{
  "title": "Catch me If you can",
  "type": "drama",
  "year": 2001
}

Внесение данных
POST favorite_films/_doc
{
  "title": "EuroTrip",
  "type": "camedy",
  "year": 2004
}

Внесение большого количества данных
POST favorite_films/_bulk
{ "index": { "_id": "2" } }
{"title": "The Wolf of Wall Street", "type": "camedy", "year": 2013}
{ "index": { "_id": "4" } }
{"title": "Ted", "type": "camedy", "year": 2012}
{ "index": { "_id": "5" } }
{"title": "Inglourious basterds", "type": ["crime", "drama", "camedy"], "year": 2009}
{ "index": { "_id": "6" } }
{"title": "The Hangover", "type": "camedy", "year": 2009}
{ "index": { "_id": "7" } }
{"title": "The Hangover Part II", "type": "camedy", "year": 2011}
{ "index": { "_id": "8" } }
{"title": "The Hangover Part III"," type": "camedy", "year": 2013}

Блок изменения данных

Обновление данных (старые данные удаляет, поэтому переносить надо и поля)
POST favorite_films/_doc/1
{
  "title": "Catch me If you can",
  "type": "drama",
  "year": 2002
} 

Обновление данных без затирания
POST favorite_films/_update/1
{
  "doc": {
    "type": ["crime","drama"]
  }
}

Блок получения данных

Получение всей информации
GET favorite_films/_search

Получение информации по id
GET favorite_films/_doc/1

Поиск, где дата выхода фильма от 2002 до 2004
GET favorite_films/_search
{
  "query": {
    "range": {
      "year": {
        "gte": 2002,
        "lte": 2004
      }
    }
  }
}

Получение всех фильмов, где жанр фильма комедия
GET favorite_films/_search
{
  "query": {
    "match": {
      "type":"camedy"
    }
  }
}

При использовании нескольких слов происходит поиск по одному слову, не все вместе

Запросы одинаковы
GET favorite_films/_search
{
  "query": {
    "match": {
      "type":"camedy drama"
    }
  }
}
GET favorite_films/_search
{
  "query": {
    "match": {
      "type": {
        "query": "drama camedy"
      }
    }
  }

Использование нескольких слов, поиск всех слов вместе
GET favorite_films/_search
{
  "query": {
    "match": {
      "type": {
        "query": "drama camedy",
        "operator": "and"
      }
    }
  }
}

Поиск фразы
GET favorite_films/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "The Hangover Part"
      }
    }
  }
}

Поиск по множеству полей
GET favorite_films/_search
{
  "query": {
    "multi_match": {
        "query": "The Hangover",
        "fields": ["title","type"],
        "type": "phrase"
      }
  }
}

Поиск с обязательным содержанием фразы и определенного года
GET favorite_films/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "title": "The Hangover Part"
          }
        },
        {
          "match": {
            "year": 2013
          }
        }
      ]
    }
  }
}

Поиск агрегатных значений по определённому названию
 GET favorite_films/_search
{
  "query": {
    "match_phrase": {
      "title": "The Hangover"
    }
  },
  "aggs": {
    "average_year": {
      "avg": {
        "field": "year"
      }
    }
  }
}

Вывод

Изучение Elasticsearch открывает перед вами широкие горизонты в области обработки и анализа данных. Этот мощный инструмент не только позволяет быстро находить информацию, но и предоставляет гибкие возможности для масштабирования и интеграции с другими системами. Освоив основы работы с индексами, документами и запросами, вы сможете эффективно обрабатывать большие объемы данных и извлекать из них ценную информацию. Мы надеемся, что это руководство стало для вас полезным стартом в мире Elasticsearch. Практика — ключ к мастерству, поэтому не бойтесь экспериментировать с различными функциями и возможностями платформы. В дальнейшем вы сможете углубить свои знания, изучая более сложные темы, такие как настройка кластеров, управление производительностью и реализация сложных поисковых запросов. Удачи в вашем обучении и успешного поиска решений с помощью Elasticsearch!

Рекомендуем прочитать книгу Мэтью Ли Кинмана "Elasticsearch in Action" и посмотреть на youtube курсы от Offical Elastic Community. Ссылка прикреплена

Комментарии (4)


  1. grosman_s_a
    20.10.2024 15:15

    Полезная статья, вся база на месте, хорошая структура, спасибо!


    1. PB_Academy Автор
      20.10.2024 15:15

      Спасибо за мнение. Старались


  1. gerneMan
    20.10.2024 15:15

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


    1. PB_Academy Автор
      20.10.2024 15:15

      Спасибо большое, старались.