From ca473fd05f48b9543af0101a706444a54753f98c Mon Sep 17 00:00:00 2001 From: Romain Ruaud Date: Thu, 8 Feb 2024 11:47:02 +0100 Subject: [PATCH] Use the configurable msm for fuzzy search. --- .../FuzzinessConfigurationInterface.php | 5 ++++ .../RelevanceConfig/Factory.php | 24 +++++++++++++++++++ .../RelevanceConfig/FuzzinessConfig.php | 24 +++++++++++++++---- .../Request/Query/Fulltext/QueryBuilder.php | 6 ++--- .../Query/Fulltext/QueryBuilderTest.php | 8 +++++-- 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfiguration/FuzzinessConfigurationInterface.php b/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfiguration/FuzzinessConfigurationInterface.php index ea16f2a04..a02cc3fb4 100644 --- a/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfiguration/FuzzinessConfigurationInterface.php +++ b/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfiguration/FuzzinessConfigurationInterface.php @@ -42,4 +42,9 @@ public function getPrefixLength(); * @return int */ public function getMaxExpansion(); + + /** + * @return string + */ + public function getMinimumShouldMatch(); } diff --git a/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/Factory.php b/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/Factory.php index 0f7a7d058..317beb8d3 100644 --- a/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/Factory.php +++ b/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/Factory.php @@ -213,6 +213,7 @@ private function getFuzzinessConfiguration($scopeCode) 'value' => $this->getConfigValue($path . "/value", $scopeCode), 'prefixLength' => $this->getConfigValue($path . "/prefix_length", $scopeCode), 'maxExpansion' => $this->getConfigValue($path . "/max_expansion", $scopeCode), + 'minimumShouldMatch' => $this->getFuzzinessMinimumShouldMatch($scopeCode), ]; $configuration = $this->createFuzzinessConfiguration($configurationParams); @@ -489,4 +490,27 @@ private function getExactMatchSortableBoostConfiguration($scopeCode) return (int) $this->getConfigValue($path . "/sortable_boost_value", $scopeCode); } + + /** + * Return the minimum should match configured for fuzzy search. + * Either the default one, or a particular if configured so. + * + * @param string $scopeCode The scope code + * + * @return string + */ + private function getFuzzinessMinimumShouldMatch($scopeCode) + { + $minimumShouldMatch = $this->getMinimumShouldMatch($scopeCode); + $useDefaultMsmPath = self::FUZZINESS_CONFIG_XML_PREFIX . '/use_default_minimum_should_match'; + $useDefaultMsm = (bool) $this->getConfigValue($useDefaultMsmPath, $scopeCode); + $fuzzyMsmPath = self::FUZZINESS_CONFIG_XML_PREFIX . '/minimum_should_match'; + $fuzzyMsm = (string) $this->getConfigValue($fuzzyMsmPath, $scopeCode); + + if ($useDefaultMsm === false && $fuzzyMsm !== '') { + $minimumShouldMatch = $fuzzyMsm; + } + + return $minimumShouldMatch; + } } diff --git a/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/FuzzinessConfig.php b/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/FuzzinessConfig.php index 763736b1d..31917ccb5 100644 --- a/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/FuzzinessConfig.php +++ b/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/FuzzinessConfig.php @@ -39,21 +39,29 @@ class FuzzinessConfig implements FuzzinessConfigurationInterface */ private $maxExpansion; + /** + * @var string + */ + private $minimumShouldMatch; + /** * RelevanceConfiguration constructor. * - * @param float $value The value - * @param int $prefixLength The prefix length - * @param int $maxExpansion The max expansion + * @param float $value The value + * @param int $prefixLength The prefix length + * @param int $maxExpansion The max expansion + * @param string $minimumShouldMatch Minimum should match clause of the fuzzy query. */ public function __construct( $value, $prefixLength, - $maxExpansion + $maxExpansion, + $minimumShouldMatch ) { $this->value = $value; $this->prefixLength = $prefixLength; $this->maxExpansion = $maxExpansion; + $this->minimumShouldMatch = $minimumShouldMatch; } /** @@ -79,4 +87,12 @@ public function getMaxExpansion() { return (int) $this->maxExpansion; } + + /** + * {@inheritDoc} + */ + public function getMinimumShouldMatch() + { + return (string) $this->minimumShouldMatch; + } } diff --git a/src/module-elasticsuite-core/Search/Request/Query/Fulltext/QueryBuilder.php b/src/module-elasticsuite-core/Search/Request/Query/Fulltext/QueryBuilder.php index d2f5974fd..6db08fde1 100644 --- a/src/module-elasticsuite-core/Search/Request/Query/Fulltext/QueryBuilder.php +++ b/src/module-elasticsuite-core/Search/Request/Query/Fulltext/QueryBuilder.php @@ -301,7 +301,7 @@ private function getFuzzyQuery(ContainerConfigurationInterface $containerConfig, $queryParams = [ 'fields' => $searchFields, 'queryText' => $queryText, - 'minimumShouldMatch' => "100%", + 'minimumShouldMatch' => $relevanceConfig->getFuzzinessConfiguration()->getMinimumShouldMatch(), 'tieBreaker' => $relevanceConfig->getTieBreaker(), 'fuzzinessConfig' => $relevanceConfig->getFuzzinessConfiguration(), 'cutoffFrequency' => $relevanceConfig->getCutoffFrequency(), @@ -311,7 +311,7 @@ private function getFuzzyQuery(ContainerConfigurationInterface $containerConfig, } /** - * Phonentic query part. + * Phonetic query part. * * @param ContainerConfigurationInterface $containerConfig Search request container configuration. * @param string $queryText The text query. @@ -330,7 +330,7 @@ private function getPhoneticQuery(ContainerConfigurationInterface $containerConf $queryParams = [ 'fields' => $searchFields, 'queryText' => $queryText, - 'minimumShouldMatch' => "100%", + 'minimumShouldMatch' => $relevanceConfig->getFuzzinessConfiguration()->getMinimumShouldMatch(), 'tieBreaker' => $relevanceConfig->getTieBreaker(), 'cutoffFrequency' => $relevanceConfig->getCutoffFrequency(), ]; diff --git a/src/module-elasticsuite-core/Test/Unit/Search/Request/Query/Fulltext/QueryBuilderTest.php b/src/module-elasticsuite-core/Test/Unit/Search/Request/Query/Fulltext/QueryBuilderTest.php index 9186d037e..3ac5b4d72 100644 --- a/src/module-elasticsuite-core/Test/Unit/Search/Request/Query/Fulltext/QueryBuilderTest.php +++ b/src/module-elasticsuite-core/Test/Unit/Search/Request/Query/Fulltext/QueryBuilderTest.php @@ -13,6 +13,7 @@ */ namespace Smile\ElasticsuiteCore\Test\Unit\Search\Request\Query\Fulltext; +use Smile\ElasticsuiteCore\Api\Search\Request\Container\RelevanceConfiguration\FuzzinessConfigurationInterface; use Smile\ElasticsuiteCore\Search\Request\Query\Fulltext\QueryBuilder; use Smile\ElasticsuiteCore\Index\Mapping\Field; use Smile\ElasticsuiteCore\Api\Search\SpellcheckerInterface; @@ -27,6 +28,8 @@ /** * Fulltext query builder test case. * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * * @category Smile * @package Smile\ElasticsuiteCore * @author Aurelien FOUCRET @@ -206,11 +209,12 @@ private function getContainerConfigMock($fields) */ private function getRelevanceConfig() { - $relevanceConfig = $this->getMockBuilder(RelevanceConfigurationInterface::class) - ->getMock(); + $relevanceConfig = $this->getMockBuilder(RelevanceConfigurationInterface::class)->getMock(); + $fuzzinessConfig = $this->getMockBuilder(FuzzinessConfigurationInterface::class)->getMock(); $relevanceConfig->method('isFuzzinessEnabled')->will($this->returnValue(true)); $relevanceConfig->method('isPhoneticSearchEnabled')->will($this->returnValue(true)); + $relevanceConfig->method('getFuzzinessConfiguration')->will($this->returnValue($fuzzinessConfig)); return $relevanceConfig; }