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 *