diff -Nuar a/vendor/magento/module-catalog-search/Model/Advanced.php b/vendor/magento/module-catalog-search/Model/Advanced.php index 5143762a07e..b498cb09e34 100644 --- a/vendor/magento/module-catalog-search/Model/Advanced.php +++ b/vendor/magento/module-catalog-search/Model/Advanced.php @@ -233,6 +233,11 @@ class Advanced extends \Magento\Framework\Model\AbstractModel ? date('Y-m-d\TH:i:s\Z', strtotime($value['to'])) : ''; } + + if ($attribute->getAttributeCode() === 'sku') { + $value = mb_strtolower($value); + } + $condition = $this->_getResource()->prepareCondition( $attribute, $value, diff -Nuar a/vendor/magento/module-elasticsearch/Model/Adapter/FieldMapper/Product/FieldProvider/StaticField.php b/vendor/magento/module-elasticsearch/Model/Adapter/FieldMapper/Product/FieldProvider/StaticField.php index 7a5d6fcdcc1..f0e9958546b 100644 --- a/vendor/magento/module-elasticsearch/Model/Adapter/FieldMapper/Product/FieldProvider/StaticField.php +++ b/vendor/magento/module-elasticsearch/Model/Adapter/FieldMapper/Product/FieldProvider/StaticField.php @@ -104,6 +104,7 @@ class StaticField implements FieldProviderInterface * @param array $context * @return array * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function getFields(array $context = []): array { @@ -120,6 +121,9 @@ class StaticField implements FieldProviderInterface $allAttributes[$fieldName] = [ 'type' => $this->fieldTypeResolver->getFieldType($attributeAdapter), ]; + if ($this->isNeedToAddCustomAnalyzer($fieldName) && $this->getCustomAnalyzer($fieldName)) { + $allAttributes[$fieldName]['analyzer'] = $this->getCustomAnalyzer($fieldName); + } $index = $this->fieldIndexResolver->getFieldIndex($attributeAdapter); if (null !== $index) { @@ -174,4 +178,26 @@ class StaticField implements FieldProviderInterface return $allAttributes; } + + /** + * Check is the custom analyzer exists for the field + * + * @param string $fieldName + * @return bool + */ + private function isNeedToAddCustomAnalyzer(string $fieldName): bool + { + return $fieldName === 'sku'; + } + + /** + * Getter for the field custom analyzer if it's exists + * + * @param string $fieldName + * @return string|null + */ + private function getCustomAnalyzer(string $fieldName): ?string + { + return $fieldName === 'sku' ? 'sku' : null; + } } diff -Nuar a/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php b/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php index 773faf49f8f..1cad781ad6d 100644 --- a/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php +++ b/vendor/magento/module-elasticsearch/Model/Adapter/Index/Builder.php @@ -8,6 +8,9 @@ namespace Magento\Elasticsearch\Model\Adapter\Index; use Magento\Framework\Locale\Resolver as LocaleResolver; use Magento\Elasticsearch\Model\Adapter\Index\Config\EsConfigInterface; +/** + * Index Builder + */ class Builder implements BuilderInterface { /** @@ -40,7 +43,7 @@ class Builder implements BuilderInterface } /** - * {@inheritdoc} + * @inheritdoc */ public function build() { @@ -59,6 +62,14 @@ class Builder implements BuilderInterface array_keys($filter) ), 'char_filter' => array_keys($charFilter) + ], + 'sku' => [ + 'type' => 'custom', + 'tokenizer' => 'keyword', + 'filter' => array_merge( + ['lowercase', 'keyword_repeat'], + array_keys($filter) + ), ] ], 'tokenizer' => $tokenizer, @@ -71,7 +82,10 @@ class Builder implements BuilderInterface } /** - * {@inheritdoc} + * Setter for storeId property + * + * @param int $storeId + * @return void */ public function setStoreId($storeId) { @@ -79,47 +93,52 @@ class Builder implements BuilderInterface } /** + * Return tokenizer configuration + * * @return array */ protected function getTokenizer() { - $tokenizer = [ + return [ 'default_tokenizer' => [ - 'type' => 'standard', - ], + 'type' => 'standard' + ] ]; - return $tokenizer; } /** + * Return filter configuration + * * @return array */ protected function getFilter() { - $filter = [ + return [ 'default_stemmer' => $this->getStemmerConfig(), 'unique_stem' => [ 'type' => 'unique', 'only_on_same_position' => true ] ]; - return $filter; } /** + * Return char filter configuration + * * @return array */ protected function getCharFilter() { - $charFilter = [ + return [ 'default_char_filter' => [ 'type' => 'html_strip', ], ]; - return $charFilter; } /** + * Return stemmer configuration + * * @return array */ protected function getStemmerConfig()