Настройка Elasticsearch/OpenSearch для поиска Magento 2
Начиная с Magento 2.4.0 MySQL-поиск полностью удалён из ядра — Elasticsearch или OpenSearch обязательны. Версия 2.4.6+ официально поддерживает Elasticsearch 8.x и OpenSearch 2.x. Правильная настройка поисковой инфраструктуры напрямую влияет на конверсию: релевантность результатов, скорость ответа и устойчивость кластера под нагрузкой.
Совместимость версий
| Magento | Elasticsearch | OpenSearch |
|---|---|---|
| 2.4.3 | 7.10 | — |
| 2.4.4–2.4.5 | 7.16–7.17 | 1.x |
| 2.4.6 | 8.x | 2.x |
| 2.4.7+ | 8.x | 2.x |
OpenSearch предпочтителен для новых проектов: Apache 2.0 лицензия, активная разработка, совместимое API.
Установка OpenSearch для production
Рекомендуемый способ — Docker или пакетная установка на отдельный сервер:
# docker-compose.yml для разработки
services:
opensearch:
image: opensearchproject/opensearch:2.11.0
environment:
- discovery.type=single-node
- DISABLE_SECURITY_PLUGIN=true
- OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g
ports:
- "9200:9200"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- opensearch-data:/usr/share/opensearch/data
Для production-кластера минимальная конфигурация — 3 узла (1 master + 2 data):
# /etc/opensearch/opensearch.yml (data node)
cluster.name: magento-search
node.name: data-node-1
node.roles: [data, ingest]
network.host: 0.0.0.0
discovery.seed_hosts: ["master-node:9300"]
cluster.initial_cluster_manager_nodes: ["master-node"]
path.data: /var/lib/opensearch
path.logs: /var/log/opensearch
# Производительность
indices.memory.index_buffer_size: 20%
thread_pool.write.queue_size: 1000
Подключение Magento к OpenSearch
bin/magento config:set catalog/search/engine opensearch
bin/magento config:set catalog/search/opensearch_server_hostname 127.0.0.1
bin/magento config:set catalog/search/opensearch_server_port 9200
bin/magento config:set catalog/search/opensearch_index_prefix magento2
bin/magento config:set catalog/search/opensearch_enable_auth 0
bin/magento config:set catalog/search/opensearch_server_timeout 15
bin/magento indexer:reindex catalogsearch_fulltext
bin/magento cache:flush
Проверка статуса индекса:
curl -X GET "localhost:9200/_cat/indices/magento2*?v&pretty"
curl -X GET "localhost:9200/magento2_product_1/_mapping?pretty" | head -80
Структура индексов Magento 2
Magento создаёт индекс с alias-схемой: magento2_product_1 (активный) и magento2_product_1_v2 (при переиндексации). Это позволяет выполнять zero-downtime reindex через alias swap.
Маппинг атрибутов в индексе управляется через Magento\Elasticsearch\Model\Adapter\FieldMapper. Кастомные атрибуты, помеченные как searchable или filterable, автоматически включаются в индекс:
// Кастомный field mapper для специфических типов
class CustomFieldMapper extends FieldMapper
{
public function getFieldName($attributeCode, $context = [])
{
if ($attributeCode === 'ean_code') {
return 'keyword_ean_code'; // точное совпадение
}
return parent::getFieldName($attributeCode, $context);
}
}
Настройка релевантности и анализаторов
Дефолтный анализатор Magento подходит для английского. Для русского языка необходим морфологический анализатор — плагин analysis-icu или analysis-morphology:
# Установка плагина для OpenSearch
bin/opensearch-plugin install analysis-icu
# Или для Elasticsearch
bin/elasticsearch-plugin install analysis-icu
Кастомный анализатор для русского языка через настройки индекса:
PUT /magento2_product_1/_settings
{
"analysis": {
"analyzer": {
"russian_search": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "russian_stop", "russian_stemmer"]
}
},
"filter": {
"russian_stop": {
"type": "stop",
"stopwords": "_russian_"
},
"russian_stemmer": {
"type": "stemmer",
"language": "russian"
}
}
}
}
Для применения кастомного анализатора переопределите конфигурацию индекса через di.xml:
<type name="Magento\Elasticsearch\Model\Adapter\Index\Config\EsConfig">
<arguments>
<argument name="configPath" xsi:type="string">custom_elasticsearch/index_config</argument>
</arguments>
</type>
Настройка поисковых весов
Magento позволяет задать веса для атрибутов в поисковом запросе через Admin → Stores → Attributes → Product → Search Weight (1–10). Дополнительно настраивается через catalog_search конфигурацию:
// Программная настройка весов через preference
// Magento\Elasticsearch\SearchAdapter\Query\Builder\Match
protected function buildMatchQueries(array $weightedFields): array
{
$queries = [];
foreach ($weightedFields as $field => $weight) {
$queries[] = [
'match' => [
$field => [
'query' => $this->query,
'boost' => $weight,
'fuzziness' => $weight > 5 ? 0 : 'AUTO',
]
]
];
}
return $queries;
}
Мониторинг и troubleshooting
Ключевые метрики для мониторинга OpenSearch в контексте Magento:
-
Heap usage — не выше 75% от
-Xmx. ПриOutOfMemoryErrorувеличьте heap или добавьте ноды. - Search latency — p95 < 200ms для продуктового поиска
- Indexing rate — мониторить при массовом импорте товаров
# Проверка здоровья кластера
curl localhost:9200/_cluster/health?pretty
# Медленные запросы
curl -X PUT "localhost:9200/magento2_product_1/_settings" -H 'Content-Type: application/json' -d'
{
"index.search.slowlog.threshold.query.warn": "2s",
"index.search.slowlog.threshold.query.info": "500ms"
}'
# Статистика поисковых запросов Magento
SELECT query_text, num_results, popularity
FROM search_query
ORDER BY popularity DESC
LIMIT 50;
Частая проблема при переиндексации: java.lang.IllegalArgumentException: mapper [price_0_1] cannot be changed from type [float] to [double]. Решение — удаление и пересоздание индекса:
curl -X DELETE "localhost:9200/magento2_product_*"
bin/magento indexer:reindex catalogsearch_fulltext
Сроки настройки
- Установка OpenSearch + подключение к Magento: 1 день
- Настройка кластера из 3 нод с репликацией: 1–2 дня
- Кастомизация анализаторов + весов для русского языка: 2–3 дня
- Интеграция с Elasticsearch Suite (Smile): 3–5 дней







