Внедрение реактивного поиска на базе ElasticSearch

Редактор
01
Представляем новый функционал для сайта Агроферма - реактивный поиск на базе ElasticSearch. Этот инновационный инструмент предоставляет мощные возможности поиска, оптимизирует производительность и улучшает пользовательский опыт.
02

Работа стандартного поиска на системе управления 1С-Битрикс

При разработке веб-приложений на базе системы управления 1С-Битрикс мы, как разработчики, часто сталкиваемся с использованием стандартного поиска, предоставляемого этой платформой. Стандартный поиск в 1С-Битрикс является удобным инструментом и отличным выбором для небольших проектов, где отсутствует значительная нагрузка и специфические требования к поисковой функциональности.

Одним из главных преимуществ стандартного поиска является его простота в использовании и интеграции. В рамках 1С-Битрикс мы можем легко настроить поиск по различным полям, задать некоторые правила ранжирования результатов. Это позволяет нам быстро добавлять базовую функциональность поиска на сайты без необходимости в дополнительной разработки или интеграции с другими инструментами.

Однако, стандартный поиск на 1С-Битрикс имеет свои ограничения, особенно когда речь идет о проектах с большим объемом данных и высокой нагрузкой на поиск. При работе с крупными базами товаров или информационными порталами, возникают проблемы с производительностью и скоростью выполнения запросов.

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

Недостатки стандартного поиска в 1С-Битрикс:

  • декоративная иконка Ограниченные возможности поиска: Стандартный поиск может не предоставлять продвинутые функции, такие как синонимы, возможность учета опечаток или расширенные фильтры.
  • декоративная иконка Медленная скорость работы: При большом объеме данных поиск в 1С-Битрикс может работать медленно, особенно если база данных не оптимизирована для поисковых запросов.
  • декоративная иконка Отсутствие ранжирования результатов: Стандартный поиск в 1С-Битрикс не предоставляет возможности для ранжирования результатов по релевантности или другим критериям.
  • декоративная иконка Недостаток гибкости настройки: Стандартный поиск имеет ограниченный набор параметров, и пользователи не могут изменять их в соответствии со своими потребностями и предпочтениями.
03

Технология ElasticSearch

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

Что такое ElasticSearch и почему он популярен?

ElasticSearch - это распределенный и масштабируемый поисковый и аналитический движок, основанный на Apache Lucene. Он предоставляет мощные возможности поиска, индексации и агрегации данных, делая его идеальным выбором для разработки сложных поисковых систем.

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

Технология ElasticSearch
04

Преимущества ElasticSearch

ElasticSearch — это мощный и распределенный поисковый и аналитический движок, основанный на Apache Lucene. Он предоставляет возможности для полнотекстового поиска, структурированного поиска, агрегации и анализа данных в реальном времени.

ElasticSearch стал популярным инструментом в разработке микросервисной архитектуры по нескольким причинам:

  • декоративная иконка Гибкость и масштабируемость: ElasticSearch позволяет горизонтальное масштабирование, что позволяет распределить данные и запросы между несколькими узлами. Он также предоставляет API для индексации и поиска данных, что делает его легко интегрируемым в микросервисы.
  • декоративная иконка Полнотекстовый поиск и аналитика: ElasticSearch обладает мощными возможностями полнотекстового поиска, позволяя выполнять сложные запросы и анализировать данные в реальном времени. Он также поддерживает функции, такие как автоматическое завершение запросов, поисковые подсказки и фасетный поиск.
  • декоративная иконка Открытый и экосистема инструментов: ElasticSearch является частью стека Elastic, который включает инструменты для сбора, хранения и визуализации данных, такие как Logstash и Kibana. Эта экосистема предоставляет полный набор инструментов для разработки и управления поиском и аналитикой.
05

Особенности поиска для сайта Агроферма

При разработке поиска для сайта компании Агроферма использовались дополнительные правила:

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

// Подготовка переменных:
// trim() удаляет лишние пробелы вокруг пользовательского запроса.
// mb_strtolower() преобразует пользовательский запрос в нижний регистр для выполнения нечувствительного к регистру сопоставления.
// mb_strtoupper() преобразует пользовательский запрос в верхний регистр для сопоставления с фразой с префиксом.

$query = trim ($_REQUEST['q']);
$fuzzy_query = mb_strtolower($query);
$match_phrase_prefix = mb_strtoupper($query);

// Проверка пустоты запроса:
// Если запрос пуст, скрипт завершается. 

if (empty($query)) {
	exit;
}

// Заменяет дефисы в пользовательском запросе на пробелы. Например, "some-query" станет "some query".

$query = str_replace('-', ' ', $query);


// Подготовка массива условий для выполнения поискового запроса в Elasticsearch:

$elastic_array = explode(' ', $query);

foreach ($elastic_array as $key => $word) {
	$elastic_array[$key] = '(*' . $word . '*)';
}

$elastic_query = implode(' AND ', $elastic_array);

// Подготовка настроек для нечеткого сопоставления:

// Создается ассоциативный массив $fuzzy_terms, содержащий параметры для нечеткого сопоставления в Elasticsearch. Значения параметров загружаются из JSON-строки.

$fuzzy_terms = json_decode('{
	"fuzziness": "AUTO",
	"max_expansions": 50,
	"prefix_length": 0,
	"transpositions": true,
	"rewrite": "constant_score"
  }', true);

// Подготовка основного запроса для Elasticsearch:
// Создается ассоциативный массив $array, который представляет основной запрос Elasticsearch. Значения параметров загружаются из JSON-строки.

$array = json_decode ('
{   
	"size": 6, 
    "sort": [
        {
            "is_own": {
                "order": "desc"
            }
        },
        {
            "hit": {
                "order": "desc"
            }
        },
        {
            "price": {
                "order": "desc"
            }
        }
    ],
    "query": {
   
        "fuzzy": {
        }
    }
}', true);

$array['query']['fuzzy']['first_word'] = $fuzzy_terms;
$array['query']['fuzzy']['first_word']['value'] = $fuzzy_query;
$result = get_elastic_result($array);

// Проверка результатов поиска:

if (empty($result['hits']['hits'])) {
	unset ($array['query']['fuzzy']['first_word']);
	$array['query']['fuzzy']['first_word_layout'] = $fuzzy_terms;
	$array['query']['fuzzy']['first_word_layout']['value'] = $fuzzy_query;
	$result = get_elastic_result($array);
}

// Проверка результатов повторного поиска:
// Если результаты повторного поиска также пусты, удаляются параметры для сопоставления фразы с префиксом.
// Вместо этого добавляются параметры для сопоставления всего запроса как единого индекса.
// Затем выполняется третий поиск Elasticsearch с обновленным запросом.

if (empty($result['hits']['hits'])) {

	unset ($array['query']['fuzzy']['first_word_layout']);
	$array['query']['fuzzy']['index'] = $fuzzy_terms;
	$array['query']['fuzzy']['index']['value'] = $fuzzy_query;
	$result = get_elastic_result($array);
}

// Затем выполняется третий поиск Elasticsearch с обновленным запросом.

 
                                            

В данном проекте мы отказались от стандартного фильтра 1С-Битрикс и переписали все с нуля на Elasticsearch. Это позволило нам построить самый быстрый фильтр на рынке. Фильтрация тура происходит за 60 милисекунд. Это примерно в 5 раз быстрее, чем успеет моргнуть человек.

Сергей Буков
Руководитель проекта
Сергей Буков
06

Результаты и преимущества реактивного поиска на ElasticSearch

Внедрение реактивного поиска на основе ElasticSearch привело к следующим результатам и преимуществам:

  • Реактивный поиск на ElasticSearch обеспечивает высокую скорость и точность поиска даже с большим объемом данных. Благодаря распределенной архитектуре и оптимизированным механизмам индексации, пользователям предоставляется мгновенный доступ к результатам поиска, даже при наличии более 10 000 уникальных товаров на сайте.
  • Улучшенна точность и релевантность: ElasticSearch предоставляет возможности для настройки релевантности поисковых результатов. Это позволило отображать наиболее соответствующие товары на первых позициях, основываясь на правилах и алгоритмах ранжирования.
  • Расширяемость и интеграция: ElasticSearch легко интегрируется с другими компонентами микросервисной архитектуры и сторонними инструментами. Это позволяет использовать ElasticSearch в сочетании с другими технологиями и расширять его возможности в соответствии с потребностями Агроферма.
  • Фильтрация и агрегация данных: С новым функционалом мы получили возможность применять различные фильтры и агрегации для уточнения результатов поиска. Пользователи могут легко найти товары по категориям и другим параметрам.
Результаты и преимущества реактивного поиска на ElasticSearch
Результаты

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