diff --git a/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php b/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php
index f5a70d2d095..26ced6c8361 100644
--- a/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php
+++ b/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php
@@ -5,8 +5,10 @@
*/
namespace Magento\Elasticsearch\Model\Adapter\Index;
+use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Locale\Resolver as LocaleResolver;
use Magento\Elasticsearch\Model\Adapter\Index\Config\EsConfigInterface;
+use Magento\Search\Model\ResourceModel\SynonymReader;
/**
* Index Builder
@@ -30,16 +32,24 @@ class Builder implements BuilderInterface
*/
protected $storeId;
+ /**
+ * @var SynonymReader
+ */
+ private $synonymReader;
+
/**
* @param LocaleResolver $localeResolver
* @param EsConfigInterface $esConfig
+ * @param SynonymReader $synonymReader
*/
public function __construct(
LocaleResolver $localeResolver,
- EsConfigInterface $esConfig
+ EsConfigInterface $esConfig,
+ SynonymReader $synonymReader
) {
$this->localeResolver = $localeResolver;
$this->esConfig = $esConfig;
+ $this->synonymReader = $synonymReader;
}
/**
@@ -50,6 +60,7 @@ class Builder implements BuilderInterface
$tokenizer = $this->getTokenizer();
$filter = $this->getFilter();
$charFilter = $this->getCharFilter();
+ $synonymFilter = $this->getSynonymFilter();
$settings = [
'analysis' => [
@@ -68,7 +79,8 @@ class Builder implements BuilderInterface
'type' => 'custom',
'tokenizer' => key($tokenizer),
'filter' => array_merge(
- ['lowercase', 'keyword_repeat']
+ ['lowercase', 'asciifolding'],
+ array_keys($synonymFilter)
),
'char_filter' => array_keys($charFilter)
],
@@ -85,12 +97,13 @@ class Builder implements BuilderInterface
'type' => 'custom',
'tokenizer' => 'keyword',
'filter' => array_merge(
- ['lowercase', 'keyword_repeat']
+ ['lowercase', 'asciifolding'],
+ array_keys($synonymFilter)
),
]
],
'tokenizer' => $tokenizer,
- 'filter' => $filter,
+ 'filter' => array_merge($filter, $synonymFilter),
'char_filter' => $charFilter,
],
];
@@ -174,4 +187,26 @@ class Builder implements BuilderInterface
'language' => $stemmerInfo['default'],
];
}
+
+ /**
+ * Get filter based on defined synonyms
+ *
+ * @throws LocalizedException
+ */
+ private function getSynonymFilter(): array
+ {
+ $synonyms = $this->synonymReader->getAllSynonyms();
+ $synonymFilter = [];
+
+ if ($synonyms) {
+ $synonymFilter = [
+ 'synonyms' => [
+ 'type' => 'synonym_graph',
+ 'synonyms' => $synonyms
+ ]
+ ];
+ }
+
+ return $synonymFilter;
+ }
}
diff --git a/vendor/magento/module-elasticsearch/Model/Indexer/Fulltext/Plugin/Search/Model/SynonymReaderPlugin.php b/vendor/magento/module-elasticsearch/Model/Indexer/Fulltext/Plugin/Search/Model/SynonymReaderPlugin.php
new file mode 100644
index 00000000000..528c21c8397
--- /dev/null
+++ b/vendor/magento/module-elasticsearch/Model/Indexer/Fulltext/Plugin/Search/Model/SynonymReaderPlugin.php
@@ -0,0 +1,67 @@
+indexerRegistry = $indexerRegistry;
+ }
+
+ /**
+ * Invalidate fulltext index after synonyms create/ update
+ *
+ * @param SynonymGroup $subject
+ * @param AbstractDb $synonymGroup
+ * @return void
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function afterSave(SynonymGroup $subject, AbstractDb $synonymGroup)
+ {
+ $this->invalidateIndexer();
+ }
+
+ /**
+ * Invalidate fulltext index after synonyms delete
+ *
+ * @param SynonymGroup $subject
+ * @param AbstractDb $synonymGroup
+ * @return void
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function afterDelete(SynonymGroup $subject, AbstractDb $synonymGroup)
+ {
+ $this->invalidateIndexer();
+ }
+
+ /**
+ * Invalidate fulltext indexer
+ *
+ * @return void
+ */
+ private function invalidateIndexer()
+ {
+ $fulltextIndexer = $this->indexerRegistry->get(Fulltext::INDEXER_ID);
+ $fulltextIndexer->invalidate();
+ }
+}
diff --git a/vendor/magento/module-elasticsearch/etc/di.xml b/vendor/magento/module-elasticsearch/etc/di.xml
index f3c109f8302..6677ebf4cea 100644
--- a/vendor/magento/module-elasticsearch/etc/di.xml
+++ b/vendor/magento/module-elasticsearch/etc/di.xml
@@ -304,14 +304,6 @@
-
-
-
- - Magento\Elasticsearch\SearchAdapter\Query\Preprocessor\Stopwords
- - Magento\Search\Adapter\Query\Preprocessor\Synonyms
-
-
-
Magento_Elasticsearch
@@ -515,7 +507,6 @@
- Magento\Elasticsearch\SearchAdapter\Query\Preprocessor\Stopwords
- - Magento\Search\Adapter\Query\Preprocessor\Synonyms
@@ -564,4 +555,7 @@
+
+
+
diff --git a/vendor/magento/module-search/Model/ResourceModel/SynonymReader.php b/vendor/magento/module-search/Model/ResourceModel/SynonymReader.php
index d589498cdaa..dc01d529362 100644
--- a/vendor/magento/module-search/Model/ResourceModel/SynonymReader.php
+++ b/vendor/magento/module-search/Model/ResourceModel/SynonymReader.php
@@ -7,6 +7,7 @@
namespace Magento\Search\Model\ResourceModel;
use Magento\Framework\DB\Helper\Mysql\Fulltext;
+use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
use Magento\Store\Model\StoreManagerInterface;
@@ -21,8 +22,6 @@ class SynonymReader extends AbstractDb
private $fullTextSelect;
/**
- * Store manager
- *
* @var StoreManagerInterface
*/
protected $storeManager;
@@ -67,6 +66,19 @@ class SynonymReader extends AbstractDb
return $this;
}
+ /**
+ * Get all synonyms as an array
+ *
+ * @throws LocalizedException
+ */
+ public function getAllSynonyms(): array
+ {
+ $connection = $this->getConnection();
+ $select = $connection->select()->from($this->getMainTable(), 'synonyms');
+
+ return $connection->fetchCol($select);
+ }
+
/**
* Init resource data
*