From a7f4563af558dcb1757263a86929a27cc3ca424b Mon Sep 17 00:00:00 2001 From: Richard BAYET Date: Mon, 3 Jul 2023 23:11:04 +0200 Subject: [PATCH] [Spellcheck] Experimental settings for better sku/reference token extraction --- .../Api/Index/Mapping/FieldInterface.php | 5 ++ .../Api/Index/MappingInterface.php | 1 + .../RelevanceConfigurationInterface.php | 22 ++++++ .../Search/Spellchecker/RequestInterface.php | 14 ++++ .../Index/Mapping.php | 6 ++ .../Index/Mapping/Field.php | 8 ++ .../Adapter/Elasticsuite/Spellchecker.php | 35 ++++++--- .../Search/Request/Builder.php | 2 + .../RelevanceConfig.php | 75 ++++++++++++++++--- .../RelevanceConfig/Factory.php | 56 ++++++++++++++ .../Request/Query/Fulltext/QueryBuilder.php | 9 ++- .../Search/Spellchecker/Request.php | 46 ++++++++++-- .../Test/Unit/Index/MappingTest.php | 4 +- .../etc/adminhtml/elasticsuite_relevance.xml | 22 ++++++ .../etc/elasticsuite_relevance.xml | 7 ++ src/module-elasticsuite-core/i18n/en_US.csv | 8 ++ src/module-elasticsuite-core/i18n/fr_FR.csv | 8 ++ 17 files changed, 296 insertions(+), 32 deletions(-) diff --git a/src/module-elasticsuite-core/Api/Index/Mapping/FieldInterface.php b/src/module-elasticsuite-core/Api/Index/Mapping/FieldInterface.php index aaa7f4600..76f130cc5 100644 --- a/src/module-elasticsuite-core/Api/Index/Mapping/FieldInterface.php +++ b/src/module-elasticsuite-core/Api/Index/Mapping/FieldInterface.php @@ -79,6 +79,11 @@ public function getType(); */ public function isSearchable(); + /** + * Is the field searchable and contains reference (sku) data. + */ + public function isSearchableReference(); + /** * Is the field filterable in navigation. * diff --git a/src/module-elasticsuite-core/Api/Index/MappingInterface.php b/src/module-elasticsuite-core/Api/Index/MappingInterface.php index 85a694900..8ab15c219 100644 --- a/src/module-elasticsuite-core/Api/Index/MappingInterface.php +++ b/src/module-elasticsuite-core/Api/Index/MappingInterface.php @@ -29,6 +29,7 @@ interface MappingInterface const DEFAULT_SEARCH_FIELD = 'search'; const DEFAULT_SPELLING_FIELD = 'spelling'; const DEFAULT_AUTOCOMPLETE_FIELD = 'autocomplete'; + const DEFAULT_REFERENCE_FIELD = 'reference'; /** * List of the properties of the mapping. diff --git a/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfigurationInterface.php b/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfigurationInterface.php index c4f2cdb9f..0c295ab77 100644 --- a/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfigurationInterface.php +++ b/src/module-elasticsuite-core/Api/Search/Request/Container/RelevanceConfigurationInterface.php @@ -86,4 +86,26 @@ public function getSpanSize(); * @return false|int */ public function getMinScore(); + + /** + * Check if the reference collector field should be used instead of the simple 'sku' field + * when building the exact match filter query. + * + * @return bool + */ + public function isUsingReferenceInExactMatchFilter(); + + /** + * Check if all tokens of the term vectors response should be used. + * + * @return bool + */ + public function isUsingAllTokens(); + + /** + * Check if the term vectors request should also include the reference analyzer collector field. + * + * @return bool + */ + public function isUsingReferenceAnalyzer(); } diff --git a/src/module-elasticsuite-core/Api/Search/Spellchecker/RequestInterface.php b/src/module-elasticsuite-core/Api/Search/Spellchecker/RequestInterface.php index 5570f3a5b..a94d9e999 100644 --- a/src/module-elasticsuite-core/Api/Search/Spellchecker/RequestInterface.php +++ b/src/module-elasticsuite-core/Api/Search/Spellchecker/RequestInterface.php @@ -43,4 +43,18 @@ public function getQueryText(); * @return float */ public function getCutoffFrequency(); + + /** + * Is the spellcheck request using all tokens returned by the term vectors. + * + * @return boolean + */ + public function isUsingAllTokens(); + + /** + * Should the spellcheck request target the 'reference' collector field. + * + * @return boolean + */ + public function isUsingReference(); } diff --git a/src/module-elasticsuite-core/Index/Mapping.php b/src/module-elasticsuite-core/Index/Mapping.php index 87d319951..4d0618b4f 100644 --- a/src/module-elasticsuite-core/Index/Mapping.php +++ b/src/module-elasticsuite-core/Index/Mapping.php @@ -62,6 +62,11 @@ class Mapping implements MappingInterface FieldInterface::ANALYZER_WHITESPACE, FieldInterface::ANALYZER_SHINGLE, ], + self::DEFAULT_REFERENCE_FIELD => [ + FieldInterface::ANALYZER_REFERENCE, + FieldInterface::ANALYZER_WHITESPACE, + FieldInterface::ANALYZER_SHINGLE, + ], ]; /** @@ -72,6 +77,7 @@ class Mapping implements MappingInterface private $copyFieldMap = [ 'isSearchable' => self::DEFAULT_SEARCH_FIELD, 'isUsedInSpellcheck' => self::DEFAULT_SPELLING_FIELD, + 'isSearchableReference' => self::DEFAULT_REFERENCE_FIELD, ]; /** diff --git a/src/module-elasticsuite-core/Index/Mapping/Field.php b/src/module-elasticsuite-core/Index/Mapping/Field.php index 98d4b376d..9a817f1e1 100644 --- a/src/module-elasticsuite-core/Index/Mapping/Field.php +++ b/src/module-elasticsuite-core/Index/Mapping/Field.php @@ -118,6 +118,14 @@ public function isSearchable(): bool return (bool) $this->config['is_searchable']; } + /** + * {@inheritdoc} + */ + public function isSearchableReference(): bool + { + return ($this->isSearchable() && (FieldInterface::ANALYZER_REFERENCE === $this->config['default_search_analyzer'])); + } + /** * {@inheritdoc} */ diff --git a/src/module-elasticsuite-core/Search/Adapter/Elasticsuite/Spellchecker.php b/src/module-elasticsuite-core/Search/Adapter/Elasticsuite/Spellchecker.php index 4df5352a2..b34df3829 100644 --- a/src/module-elasticsuite-core/Search/Adapter/Elasticsuite/Spellchecker.php +++ b/src/module-elasticsuite-core/Search/Adapter/Elasticsuite/Spellchecker.php @@ -89,7 +89,7 @@ private function loadSpellingType(RequestInterface $request) try { $cutoffFrequencyLimit = $this->getCutoffrequencyLimit($request); $termVectors = $this->getTermVectors($request); - $queryTermStats = $this->parseTermVectors($termVectors, $cutoffFrequencyLimit); + $queryTermStats = $this->parseTermVectors($termVectors, $cutoffFrequencyLimit, $request->isUsingAllTokens()); if ($queryTermStats['total'] == $queryTermStats['stop']) { $spellingType = self::SPELLING_TYPE_PURE_STOPWORDS; @@ -164,6 +164,11 @@ private function getTermVectors(RequestInterface $request) ], ]; + if ($request->isUsingReference()) { + $doc['fields'][] = MappingInterface::DEFAULT_REFERENCE_FIELD . "." . FieldInterface::ANALYZER_REFERENCE; + $doc['doc'][MappingInterface::DEFAULT_REFERENCE_FIELD] = $request->getQueryText(); + } + $docs = []; // Compute the mtermvector query on all shards to ensure exhaustive results. @@ -186,15 +191,18 @@ private function getTermVectors(RequestInterface $request) * - missing : number of terms of the query not found into the index * - standard : number of terms of the query found using the standard analyzer. * - * @param array $termVectors The term vector query response. - * @param int $cutoffFrequencyLimit Cutoff freq (max absolute number of docs to consider term as a stopword). + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param array $termVectors The term vector query response. + * @param int $cutoffFrequencyLimit Cutoff freq (max absolute number of docs to consider term as a stopword). + * @param boolean $useAllTokens Whether to use all tokens or not * * @return array */ - private function parseTermVectors($termVectors, $cutoffFrequencyLimit) + private function parseTermVectors($termVectors, $cutoffFrequencyLimit, $useAllTokens = false) { $queryTermStats = ['stop' => 0, 'exact' => 0, 'standard' => 0, 'missing' => 0]; - $statByPosition = $this->extractTermStatsByPosition($termVectors); + $statByPosition = $this->extractTermStatsByPosition($termVectors, $useAllTokens); foreach ($statByPosition as $positionStat) { $type = 'missing'; @@ -204,6 +212,8 @@ private function parseTermVectors($termVectors, $cutoffFrequencyLimit) $type = 'stop'; } elseif (in_array(FieldInterface::ANALYZER_WHITESPACE, $positionStat['analyzers'])) { $type = 'exact'; + } elseif (in_array(FieldInterface::ANALYZER_REFERENCE, $positionStat['analyzers'])) { + $type = 'exact'; } } $queryTermStats[$type]++; @@ -216,18 +226,20 @@ private function parseTermVectors($termVectors, $cutoffFrequencyLimit) /** * Extract term stats by position from a term vectors query response. - * Wil return an array of doc_freq, analayzers and term by position. + * Will return an array of doc_freq, analyzers and term by position. * * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * - * @param array $termVectors The term vector query response. + * @param array $termVectors The term vector query response. + * @param boolean $useAllTokens Whether to use all tokens returned in the term vector response. * * @return array */ - private function extractTermStatsByPosition($termVectors) + private function extractTermStatsByPosition($termVectors, $useAllTokens = false) { $statByPosition = []; - $analyzers = [FieldInterface::ANALYZER_STANDARD, FieldInterface::ANALYZER_WHITESPACE]; + $analyzers = [FieldInterface::ANALYZER_STANDARD, FieldInterface::ANALYZER_WHITESPACE, FieldInterface::ANALYZER_REFERENCE]; if (is_array($termVectors) && isset($termVectors['docs'])) { foreach ($termVectors['docs'] as $termVector) { @@ -237,6 +249,9 @@ private function extractTermStatsByPosition($termVectors) foreach ($fieldData['terms'] as $term => $termStats) { foreach ($termStats['tokens'] as $token) { $positionKey = $token['position']; + if ($useAllTokens) { + $positionKey = "{$token['position']}_{$token['start_offset']}_{$token['end_offset']}"; + } if (!isset($termStats['doc_freq'])) { $termStats['doc_freq'] = 0; @@ -266,7 +281,7 @@ private function extractTermStatsByPosition($termVectors) } /** - * Extract analayser from a mapping property name. + * Extract analyser from a mapping property name. * * @param string $propertyName Property name (eg. : search.whitespace) * diff --git a/src/module-elasticsuite-core/Search/Request/Builder.php b/src/module-elasticsuite-core/Search/Request/Builder.php index 2d8ca8f89..1022de0bf 100644 --- a/src/module-elasticsuite-core/Search/Request/Builder.php +++ b/src/module-elasticsuite-core/Search/Request/Builder.php @@ -224,6 +224,8 @@ private function getSpellingType(ContainerConfigurationInterface $containerConfi 'index' => $containerConfig->getIndexName(), 'queryText' => $queryText, 'cutoffFrequency' => $containerConfig->getRelevanceConfig()->getCutOffFrequency(), + 'isUsingAllTokens' => $containerConfig->getRelevanceConfig()->isUsingAllTokens(), + 'isUsingReference' => $containerConfig->getRelevanceConfig()->isUsingReferenceAnalyzer(), ]; $spellcheckRequest = $this->spellcheckRequestFactory->create($spellcheckRequestParams); diff --git a/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig.php b/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig.php index a4de6b30c..b4ea04436 100644 --- a/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig.php +++ b/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig.php @@ -70,22 +70,43 @@ class RelevanceConfig implements RelevanceConfigurationInterface */ private $minScore; + /** + * @var boolean + */ + private $useReferenceInExactMatchFilter; + + /** + * @var boolean + */ + private $useAllTokens; + + /** + * @var boolean + */ + private $useReferenceAnalyzer; + /** * RelevanceConfiguration constructor. * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * @SuppressWarnings(PHPMD.ExcessiveParameterList) * - * @param string $minimumShouldMatch Minimum should match clause of the text query. - * @param float $tieBreaker Tie breaker for multimatch queries. - * @param int|null $phraseMatchBoost The Phrase match boost value, or null if not - * enabled - * @param float $cutOffFrequency The cutoff Frequency value - * @param FuzzinessConfigurationInterface|null $fuzziness The fuzziness Configuration, or null - * @param boolean $enablePhoneticSearch The phonetic Configuration, or null - * @param int|null $spanMatchBoost The Span match boost value, or null if not - * enabled - * @param int|null $spanSize The number of terms to match in span queries - * @param int|null $minScore The Min Score value, or null if not enabled + * @param string $minimumShouldMatch Minimum should match clause of the text query. + * @param float $tieBreaker Tie breaker for multimatch queries. + * @param int|null $phraseMatchBoost The Phrase match boost value, or null if not + * enabled + * @param float $cutOffFrequency The cutoff Frequency value + * @param FuzzinessConfigurationInterface|null $fuzziness The fuzziness Configuration, or null + * @param boolean $enablePhoneticSearch The phonetic Configuration, or null + * @param int|null $spanMatchBoost The Span match boost value, or null if not + * enabled + * @param int|null $spanSize The number of terms to match in span queries + * @param int|null $minScore The Min Score value, or null if not enabled + * @param boolean $useReferenceInExactMatchFilter Whether to use the reference collector field instead of + * the 'sku' field in the exact match filter query + * @param boolean $useAllTokens Whether to take into account all term vectors tokens + * @param boolean $useReferenceAnalyzer Whether to include the collector field associated + * with the reference analyzer in term vectors request */ public function __construct( $minimumShouldMatch, @@ -96,7 +117,10 @@ public function __construct( $enablePhoneticSearch = false, $spanMatchBoost = null, $spanSize = null, - $minScore = null + $minScore = null, + $useReferenceInExactMatchFilter = false, + $useAllTokens = false, + $useReferenceAnalyzer = false ) { $this->minimumShouldMatch = $minimumShouldMatch; $this->tieBreaker = $tieBreaker; @@ -107,6 +131,9 @@ public function __construct( $this->spanMatchBoost = $spanMatchBoost; $this->spanSize = $spanSize; $this->minScore = $minScore; + $this->useReferenceInExactMatchFilter = $useReferenceInExactMatchFilter; + $this->useAllTokens = $useAllTokens; + $this->useReferenceAnalyzer = $useReferenceAnalyzer; } /** @@ -194,4 +221,28 @@ public function getMinScore() { return (int) $this->minScore; } + + /** + * {@inheritDoc} + */ + public function isUsingReferenceInExactMatchFilter() + { + return (bool) $this->useReferenceInExactMatchFilter; + } + + /** + * {@inheritDoc} + */ + public function isUsingAllTokens() + { + return (bool) $this->useAllTokens; + } + + /** + * {@inheritDoc} + */ + public function isUsingReferenceAnalyzer() + { + return (bool) $this->useReferenceAnalyzer; + } } 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 5f511984a..b884e4e2a 100644 --- a/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/Factory.php +++ b/src/module-elasticsuite-core/Search/Request/ContainerConfiguration/RelevanceConfig/Factory.php @@ -73,6 +73,21 @@ class Factory */ const MIN_SCORE_CONFIG_XML_PREFIX = 'min_score_configuration'; + /** + * XML node for using reference in the exact match filter query + */ + const EXACT_MATCH_USE_REFERENCE_IN_FILTER_XML_PATH = 'exact_match_configuration/use_reference_in_filter'; + + /** + * XML node for tokens usage in term vectors configuration. + */ + const TERM_VECTORS_TOKENS_CONFIG_XML_PATH = 'spellchecking/term_vectors/use_all_tokens'; + + /** + * XML node for reference analyzer usage in term vectors configuration. + */ + const TERM_VECTORS_USE_REFERENCE_CONFIG_XML_PATH = 'spellchecking/term_vectors/use_reference_analyzer'; + /** * @var RelevanceConfigurationInterface[] */ @@ -147,6 +162,9 @@ protected function loadConfiguration($scopeCode) 'spanMatchBoost' => $this->getSpanMatchBoostConfiguration($scopeCode), 'spanSize' => $this->getSpanSize($scopeCode), 'minScore' => $this->getMinScoreConfiguration($scopeCode), + 'useReferenceInExactMatchFilter' => $this->isUsingReferenceInExactMatchFilter($scopeCode), + 'useAllTokens' => $this->isUsingAllTokensConfiguration($scopeCode), + 'useReferenceAnalyzer' => $this->isUsingReferenceAnalyzerConfiguration($scopeCode), ]; return $configurationParams; @@ -354,4 +372,42 @@ private function getMinScoreConfiguration($scopeCode) return $minScore; } + + /** + * Retrieve reference collector field usage configuration for a container. + * + * @param @param string $scopeCode The scope code + * + * @return bool + */ + private function isUsingReferenceInExactMatchFilter($scopeCode) + { + $path = self::BASE_RELEVANCE_CONFIG_XML_PREFIX . "/" . self::EXACT_MATCH_USE_REFERENCE_IN_FILTER_XML_PATH; + + return (bool) $this->getConfigValue($path, $scopeCode); + } + + /** + * Retrieve term vectors extensive tokens usage configuration for a container. + * + * @param string $scopeCode The scope code + * + * @return bool + */ + private function isUsingAllTokensConfiguration($scopeCode) + { + return (bool) $this->getConfigValue(self::TERM_VECTORS_TOKENS_CONFIG_XML_PATH, $scopeCode); + } + + /** + * Retrieve term vectors reference analyzer usage configuration for a container. + * + * @param string $scopeCode The scope code + * + * @return bool + */ + private function isUsingReferenceAnalyzerConfiguration($scopeCode) + { + return (bool) $this->getConfigValue(self::TERM_VECTORS_USE_REFERENCE_CONFIG_XML_PATH, $scopeCode); + } } 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 a19087f60..325142969 100644 --- a/src/module-elasticsuite-core/Search/Request/Query/Fulltext/QueryBuilder.php +++ b/src/module-elasticsuite-core/Search/Request/Query/Fulltext/QueryBuilder.php @@ -124,6 +124,13 @@ private function getCutoffFrequencyQuery(ContainerConfigurationInterface $contai 'minimumShouldMatch' => $relevanceConfig->getMinimumShouldMatch(), ]; + if ($containerConfig->getRelevanceConfig()->isUsingReferenceInExactMatchFilter()) { + $queryParams['fields'] = array_fill_keys( + [MappingInterface::DEFAULT_SEARCH_FIELD, MappingInterface::DEFAULT_REFERENCE_FIELD . ".reference"], + 1 + ); + } + return $this->queryFactory->create(QueryInterface::TYPE_MULTIMATCH, $queryParams); } @@ -200,7 +207,7 @@ private function getPureStopwordsQuery(ContainerConfigurationInterface $containe } /** - * Spellcheked query building. + * Spellchecked query building. * * @param ContainerConfigurationInterface $containerConfig Search request container configuration. * @param string $queryText The text query. diff --git a/src/module-elasticsuite-core/Search/Spellchecker/Request.php b/src/module-elasticsuite-core/Search/Spellchecker/Request.php index e78bbaffe..c93785e68 100644 --- a/src/module-elasticsuite-core/Search/Spellchecker/Request.php +++ b/src/module-elasticsuite-core/Search/Spellchecker/Request.php @@ -40,20 +40,36 @@ class Request implements RequestInterface /** * @var float */ - private $cufoffFrequency; + private $cutoffFrequency; + + /** + * @var boolean + */ + private $isUsingAllTokens; + + /** + * @var boolean + */ + private $isUsingReference; /** * Constructor. * - * @param string $index Spellcheck request index name. - * @param string $queryText Spellcheck fulltext query. - * @param float $cutoffFrequency Spellcheck cutoff frequency (used to detect stopwords). + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + * + * @param string $index Spellcheck request index name. + * @param string $queryText Spellcheck fulltext query. + * @param float $cutoffFrequency Spellcheck cutoff frequency (used to detect stopwords). + * @param boolean $isUsingAllTokens Is spellcheck using all tokens returned by term vectors. + * @param boolean $isUsingReference Should the reference analyzer be included in the spellcheck request. */ - public function __construct($index, $queryText, $cutoffFrequency) + public function __construct($index, $queryText, $cutoffFrequency, $isUsingAllTokens, $isUsingReference) { $this->index = $index; $this->queryText = $queryText; - $this->cufoffFrequency = $cutoffFrequency; + $this->cutoffFrequency = $cutoffFrequency; + $this->isUsingAllTokens = $isUsingAllTokens; + $this->isUsingReference = $isUsingReference; } /** @@ -77,6 +93,22 @@ public function getQueryText() */ public function getCutoffFrequency() { - return $this->cufoffFrequency; + return $this->cutoffFrequency; + } + + /** + * {@inheritDoc} + */ + public function isUsingAllTokens() + { + return $this->isUsingAllTokens; + } + + /** + * {@inheritDoc} + */ + public function isUsingReference() + { + return $this->isUsingReference; } } diff --git a/src/module-elasticsuite-core/Test/Unit/Index/MappingTest.php b/src/module-elasticsuite-core/Test/Unit/Index/MappingTest.php index 53a2e8c21..778cb8e32 100644 --- a/src/module-elasticsuite-core/Test/Unit/Index/MappingTest.php +++ b/src/module-elasticsuite-core/Test/Unit/Index/MappingTest.php @@ -112,7 +112,7 @@ public function testBasicFields() $properties = $this->mapping->getProperties(); $this->assertCount(5, $fields); - $this->assertCount(6, $properties); + $this->assertCount(7, $properties); $this->assertEquals('entity_id', $this->mapping->getIdField()->getName()); $this->assertArrayHasKey('entity_id', $fields); @@ -167,7 +167,7 @@ public function testMappingGeneration() { $mapping = $this->mapping->asArray(); $this->assertArrayHasKey('properties', $mapping); - $this->assertCount(6, $mapping['properties']); + $this->assertCount(7, $mapping['properties']); } /** diff --git a/src/module-elasticsuite-core/etc/adminhtml/elasticsuite_relevance.xml b/src/module-elasticsuite-core/etc/adminhtml/elasticsuite_relevance.xml index 8b9dfdc3b..95a62e5b4 100644 --- a/src/module-elasticsuite-core/etc/adminhtml/elasticsuite_relevance.xml +++ b/src/module-elasticsuite-core/etc/adminhtml/elasticsuite_relevance.xml @@ -96,6 +96,15 @@ min_score are not included in the search results.]]> + + + + + + Magento\Config\Model\Config\Source\Yesno + + +
@@ -145,6 +154,19 @@ + + + + + Magento\Config\Model\Config\Source\Yesno + + + + + Magento\Config\Model\Config\Source\Yesno + + +
diff --git a/src/module-elasticsuite-core/etc/elasticsuite_relevance.xml b/src/module-elasticsuite-core/etc/elasticsuite_relevance.xml index dd359f601..045e99f50 100644 --- a/src/module-elasticsuite-core/etc/elasticsuite_relevance.xml +++ b/src/module-elasticsuite-core/etc/elasticsuite_relevance.xml @@ -38,6 +38,9 @@ 0 0 + + 0 + @@ -49,6 +52,10 @@ 1 + + 0 + 0 + diff --git a/src/module-elasticsuite-core/i18n/en_US.csv b/src/module-elasticsuite-core/i18n/en_US.csv index aee9335db..bb9a1edb9 100644 --- a/src/module-elasticsuite-core/i18n/en_US.csv +++ b/src/module-elasticsuite-core/i18n/en_US.csv @@ -78,3 +78,11 @@ Autocomplete,Autocomplete "Enable Boost on Span Match","Enable Boost on Span Match" "Span Match Boost Value","Span Match Boost Value" "Number of words to match at the beginning of the string","Number of words to match at the beginning of the string" +"Exact Match Configuration","Exact Match Configuration" +"[Experimental] Use reference analyzer in exact matching filter query","[Experimental] Use reference analyzer in exact matching filter query" +"Experimental: Instead of the 'sku' field, use the 'reference' collector field which contains all searchable fields using the 'reference' analyzer when building the exact/most exact matching filter query. Useful for sku/reference matching.","Experimental: Instead of the 'sku' field, use the 'reference' collector field which contains all searchable fields using the 'reference' analyzer when building the exact/most exact matching filter query. Useful for sku/reference matching." +"Term Vectors Configuration","Term Vectors Configuration" +"[Experimental] Use all tokens from term vectors","[Experimental] Use all tokens from term vectors" +"Experimental: Take into account all tokens from the term vectors response, instead of one token per position. Useful for sku/reference matching.","Experimental: Take into account all tokens from the term vectors response, instead of one token per position. Useful for sku/reference matching." +"[Experimental] Use reference analyzer in term vectors","[Experimental] Use reference analyzer in term vectors" +"Experimental: Include the 'reference' collector field which contains all searchable fields using the 'reference' analyzer when performing the term vectors request. Useful for sku/reference matching.","Experimental: Include the 'reference' collector field which contains all searchable fields using the 'reference' analyzer when performing the term vectors request. Useful for sku/reference matching." diff --git a/src/module-elasticsuite-core/i18n/fr_FR.csv b/src/module-elasticsuite-core/i18n/fr_FR.csv index f9ec5ef28..c33c8ef0a 100644 --- a/src/module-elasticsuite-core/i18n/fr_FR.csv +++ b/src/module-elasticsuite-core/i18n/fr_FR.csv @@ -78,3 +78,11 @@ General,Général "Enable Boost on Span Match","Activer le boost sur le début des champs" "Span Match Boost Value","Valeur du boost" "Number of words to match at the beginning of the string","Nombre de mots à matcher au début des champs" +"Exact Match Configuration","Configuration Recherche Exacte" +"[Experimental] Use reference analyzer in exact matching filter query","[Expérimental] Utiliser l'analyseur reference dans le filtre de requête d'exact matching" +"Experimental: Instead of the 'sku' field, use the 'reference' collector field which contains all searchable fields using the 'reference' analyzer when building the exact/most exact matching filter query. Useful for sku/reference matching.","Expérimental: Plutôt que le champ 'sku' seul, utiliser le champ collecteur 'reference' qui contient tous les champs cherchables utilisant l'analyseur 'reference' lors de la construction du filtre de requête exact/most exact. Utile pour le matching de sku/références produit." +"Term Vectors Configuration","Configuration des Term Vectors" +"[Experimental] Use all tokens from term vectors","[Expérimental] Utiliser tous les tokens des term vectors" +"Experimental: Take into account all tokens from the term vectors response, instead of one token per position. Useful for sku/reference matching.","Expérimental: Prendre en considération tous les tokens de la réponse des term vectors, plutôt qu'un seul token par position. Utile pour matcher les sku/références." +"[Experimental] Use reference analyzer in term vectors","[Expérimental] Utiliser l'analyseur reference dans les term vectors" +"Experimental: Include the 'reference' collector field which contains all searchable fields using the 'reference' analyzer when performing the term vectors request. Useful for sku/reference matching.","Expérimental: Inclure le champ collecteur 'reference' qui contient tous les champs cherchables utilisant l'analyseur 'reference' lors de la requête des term vectors. Utile pour le matching de sku/références produit."