Skip to content

Commit e74af43

Browse files
committed
ACP2E-99: "Search Synonyms" no longer works when value is added in "Minimum Terms to Match"
1 parent 65714d4 commit e74af43

File tree

3 files changed

+109
-5
lines changed

3 files changed

+109
-5
lines changed

app/code/Magento/Elasticsearch/Model/Adapter/Index/Builder.php

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
*/
66
namespace Magento\Elasticsearch\Model\Adapter\Index;
77

8+
use Magento\Framework\Exception\LocalizedException;
89
use Magento\Framework\Locale\Resolver as LocaleResolver;
910
use Magento\Elasticsearch\Model\Adapter\Index\Config\EsConfigInterface;
11+
use Magento\Search\Model\ResourceModel\SynonymReader;
1012

1113
/**
1214
* Index Builder
@@ -30,16 +32,24 @@ class Builder implements BuilderInterface
3032
*/
3133
protected $storeId;
3234

35+
/**
36+
* @var SynonymReader
37+
*/
38+
private $synonymReader;
39+
3340
/**
3441
* @param LocaleResolver $localeResolver
3542
* @param EsConfigInterface $esConfig
43+
* @param SynonymReader $synonymReader
3644
*/
3745
public function __construct(
3846
LocaleResolver $localeResolver,
39-
EsConfigInterface $esConfig
47+
EsConfigInterface $esConfig,
48+
SynonymReader $synonymReader
4049
) {
4150
$this->localeResolver = $localeResolver;
4251
$this->esConfig = $esConfig;
52+
$this->synonymReader = $synonymReader;
4353
}
4454

4555
/**
@@ -50,6 +60,7 @@ public function build()
5060
$tokenizer = $this->getTokenizer();
5161
$filter = $this->getFilter();
5262
$charFilter = $this->getCharFilter();
63+
$synonymFilter = $this->getSynonymFilter();
5364

5465
$settings = [
5566
'analysis' => [
@@ -67,7 +78,10 @@ public function build()
6778
'prefix_search' => [
6879
'type' => 'custom',
6980
'tokenizer' => key($tokenizer),
70-
'filter' => ['lowercase', 'asciifolding'],
81+
'filter' => array_merge(
82+
['lowercase', 'asciifolding'],
83+
array_keys($synonymFilter)
84+
),
7185
'char_filter' => array_keys($charFilter)
7286
],
7387
'sku' => [
@@ -82,11 +96,14 @@ public function build()
8296
'sku_prefix_search' => [
8397
'type' => 'custom',
8498
'tokenizer' => 'keyword',
85-
'filter' => ['lowercase', 'asciifolding']
99+
'filter' => array_merge(
100+
['lowercase', 'asciifolding'],
101+
array_keys($synonymFilter)
102+
),
86103
]
87104
],
88105
'tokenizer' => $tokenizer,
89-
'filter' => $filter,
106+
'filter' => array_merge($filter, $synonymFilter),
90107
'char_filter' => $charFilter,
91108
],
92109
];
@@ -170,4 +187,28 @@ protected function getStemmerConfig()
170187
'language' => $stemmerInfo['default'],
171188
];
172189
}
190+
191+
/**
192+
* Get filter based on defined synonyms
193+
*
194+
* @throws LocalizedException
195+
*/
196+
private function getSynonymFilter(): array {
197+
$connection = $this->synonymReader->getConnection();
198+
$select = $connection->select()->from($this->synonymReader->getMainTable(), 'synonyms');
199+
$synonyms = $connection->fetchCol($select);
200+
201+
$synonymFilter = [];
202+
203+
if ($synonyms) {
204+
$synonymFilter = [
205+
'synonyms' => [
206+
'type' => 'synonym_graph',
207+
'synonyms' => $synonyms
208+
]
209+
];
210+
}
211+
212+
return $synonymFilter;
213+
}
173214
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\Elasticsearch\Model\Indexer\Fulltext\Plugin\Search\Model;
10+
11+
use Magento\CatalogSearch\Model\Indexer\Fulltext;
12+
use Magento\Framework\Indexer\IndexerRegistry;
13+
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
14+
use Magento\Search\Model\ResourceModel\SynonymGroup;
15+
16+
class SynonymReaderPlugin
17+
{
18+
/**
19+
* @var IndexerRegistry
20+
*/
21+
private $indexerRegistry;
22+
23+
/**
24+
* @param IndexerRegistry $indexerRegistry
25+
*/
26+
public function __construct(IndexerRegistry $indexerRegistry) {
27+
$this->indexerRegistry = $indexerRegistry;
28+
}
29+
30+
/**
31+
* @param SynonymGroup $subject
32+
* @param AbstractDb $synonymGroup
33+
* @return void
34+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
35+
*/
36+
public function afterSave(SynonymGroup $subject, AbstractDb $synonymGroup) {
37+
$this->invalidateIndexer();
38+
}
39+
40+
/**
41+
* @param SynonymGroup $subject
42+
* @param AbstractDb $synonymGroup
43+
* @return void
44+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
45+
*/
46+
public function afterDelete(SynonymGroup $subject, AbstractDb $synonymGroup) {
47+
$this->invalidateIndexer();
48+
}
49+
50+
/**
51+
* Invalidate fulltext indexer
52+
*
53+
* @return void
54+
*/
55+
private function invalidateIndexer() {
56+
$fulltextIndexer = $this->indexerRegistry->get(Fulltext::INDEXER_ID);
57+
if (!$fulltextIndexer->isScheduled()) {
58+
$fulltextIndexer->invalidate();
59+
}
60+
}
61+
}

app/code/Magento/Elasticsearch/etc/di.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,6 @@
515515
<arguments>
516516
<argument name="preprocessors" xsi:type="array">
517517
<item name="stopwordsPreprocessor" xsi:type="object">Magento\Elasticsearch\SearchAdapter\Query\Preprocessor\Stopwords</item>
518-
<item name="synonymsPreprocessor" xsi:type="object">Magento\Search\Adapter\Query\Preprocessor\Synonyms</item>
519518
</argument>
520519
</arguments>
521520
</type>
@@ -564,6 +563,9 @@
564563
<type name="Magento\Catalog\Model\ResourceModel\Attribute">
565564
<plugin name="updateElasticsearchIndexerMapping" type="Magento\Elasticsearch\Model\Indexer\Fulltext\Plugin\Category\Product\Attribute"/>
566565
</type>
566+
<type name="Magento\Search\Model\ResourceModel\SynonymGroup">
567+
<plugin name="synonymReaderPlugin" type="Magento\Elasticsearch\Model\Indexer\Fulltext\Plugin\Search\Model\SynonymReaderPlugin"/>
568+
</type>
567569
<type name="Magento\Elasticsearch\Model\Indexer\IndexerHandler">
568570
<arguments>
569571
<argument name="cacheContext" xsi:type="object">Magento\Framework\Indexer\CacheContext\Proxy</argument>

0 commit comments

Comments
 (0)