Внедрение реактивного поиска на базе ElasticSearch
Работа стандартного поиска на системе управления 1С-Битрикс
При разработке веб-приложений на базе системы управления 1С-Битрикс мы, как разработчики, часто сталкиваемся с использованием стандартного поиска, предоставляемого этой платформой. Стандартный поиск в 1С-Битрикс является удобным инструментом и отличным выбором для небольших проектов, где отсутствует значительная нагрузка и специфические требования к поисковой функциональности.
Одним из главных преимуществ стандартного поиска является его простота в использовании и интеграции. В рамках 1С-Битрикс мы можем легко настроить поиск по различным полям, задать некоторые правила ранжирования результатов. Это позволяет нам быстро добавлять базовую функциональность поиска на сайты без необходимости в дополнительной разработки или интеграции с другими инструментами.
Однако, стандартный поиск на 1С-Битрикс имеет свои ограничения, особенно когда речь идет о проектах с большим объемом данных и высокой нагрузкой на поиск. При работе с крупными базами товаров или информационными порталами, возникают проблемы с производительностью и скоростью выполнения запросов.
Стандартный поиск не всегда может эффективно обрабатывать сложные запросы, поскольку его алгоритмы и механизмы индексации имеют определенные ограничения. Он может столкнуться с проблемами при поиске по большому количеству полей или при использовании сложных логических условий. В результате этого пользователи могут столкнуться с медленной скоростью выполнения запросов и неудовлетворительными результатами поиска.
Недостатки стандартного поиска в 1С-Битрикс:
-
Ограниченные возможности поиска: Стандартный поиск может не предоставлять продвинутые функции, такие как синонимы, возможность учета опечаток или расширенные фильтры.
-
Медленная скорость работы: При большом объеме данных поиск в 1С-Битрикс может работать медленно, особенно если база данных не оптимизирована для поисковых запросов.
-
Отсутствие ранжирования результатов: Стандартный поиск в 1С-Битрикс не предоставляет возможности для ранжирования результатов по релевантности или другим критериям.
-
Недостаток гибкости настройки: Стандартный поиск имеет ограниченный набор параметров, и пользователи не могут изменять их в соответствии со своими потребностями и предпочтениями.
Технология ElasticSearch
В современном мире, где данные растут экспоненциально, эффективный поиск становится важной составляющей любого веб-приложения. В этой статье мы рассмотрим разработку мощного поиска на основе ElasticSearch — популярной и масштабируемой технологии, которая позволяет справиться с вызовами поиска больших объемов данных.
Что такое ElasticSearch и почему он популярен?
ElasticSearch - это распределенный и масштабируемый поисковый и аналитический движок, основанный на Apache Lucene. Он предоставляет мощные возможности поиска, индексации и агрегации данных, делая его идеальным выбором для разработки сложных поисковых систем.
Одной из главных причин популярности ElasticSearch является его способность обрабатывать и анализировать большие объемы данных в реальном времени. Он позволяет осуществлять быстрый и точный поиск в больших наборах данных, сохраняя высокую производительность даже при растущем объеме информации.
Преимущества ElasticSearch
ElasticSearch — это мощный и распределенный поисковый и аналитический движок, основанный на Apache Lucene. Он предоставляет возможности для полнотекстового поиска, структурированного поиска, агрегации и анализа данных в реальном времени.
ElasticSearch стал популярным инструментом в разработке микросервисной архитектуры по нескольким причинам:
-
Гибкость и масштабируемость: ElasticSearch позволяет горизонтальное масштабирование, что позволяет распределить данные и запросы между несколькими узлами. Он также предоставляет API для индексации и поиска данных, что делает его легко интегрируемым в микросервисы.
-
Полнотекстовый поиск и аналитика: ElasticSearch обладает мощными возможностями полнотекстового поиска, позволяя выполнять сложные запросы и анализировать данные в реальном времени. Он также поддерживает функции, такие как автоматическое завершение запросов, поисковые подсказки и фасетный поиск.
-
Открытый и экосистема инструментов: ElasticSearch является частью стека Elastic, который включает инструменты для сбора, хранения и визуализации данных, такие как Logstash и Kibana. Эта экосистема предоставляет полный набор инструментов для разработки и управления поиском и аналитикой.
Особенности поиска для сайта Агроферма
При разработке поиска для сайта компании Агроферма использовались дополнительные правила:
-
Снала необходимо показывать товары, которые располагаются в определенных разделах на сайте и представляют наибольший интерес для компании. Например, товары Собственного производства следует отображать первыми.
-
Реализация поиска на странице с помощью фильтрации массива 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 раз быстрее, чем успеет моргнуть человек.
Результаты и преимущества реактивного поиска на ElasticSearch
Внедрение реактивного поиска на основе ElasticSearch привело к следующим результатам и преимуществам:
- Реактивный поиск на ElasticSearch обеспечивает высокую скорость и точность поиска даже с большим объемом данных. Благодаря распределенной архитектуре и оптимизированным механизмам индексации, пользователям предоставляется мгновенный доступ к результатам поиска, даже при наличии более 10 000 уникальных товаров на сайте.
- Улучшенна точность и релевантность: ElasticSearch предоставляет возможности для настройки релевантности поисковых результатов. Это позволило отображать наиболее соответствующие товары на первых позициях, основываясь на правилах и алгоритмах ранжирования.
- Расширяемость и интеграция: ElasticSearch легко интегрируется с другими компонентами микросервисной архитектуры и сторонними инструментами. Это позволяет использовать ElasticSearch в сочетании с другими технологиями и расширять его возможности в соответствии с потребностями Агроферма.
- Фильтрация и агрегация данных: С новым функционалом мы получили возможность применять различные фильтры и агрегации для уточнения результатов поиска. Пользователи могут легко найти товары по категориям и другим параметрам.