Налаштування 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"
}
}
}
}
Моніторинг та troubleshooting
Ключові метрики для моніторингу:
-
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 днів







