central config part 1
This commit is contained in:
@@ -6,24 +6,13 @@ namespace App\Config;
|
||||
|
||||
final class CommerceQueryParserConfig
|
||||
{
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getKnownBrands(): array
|
||||
{
|
||||
return [
|
||||
private const KNOWN_BRANDS = [
|
||||
'heyl',
|
||||
'horiba',
|
||||
'neomeris',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getPhrasesToRemove(): array
|
||||
{
|
||||
return [
|
||||
private const PHRASES_TO_REMOVE = [
|
||||
'ich suche',
|
||||
'suche',
|
||||
'habt ihr',
|
||||
@@ -51,24 +40,8 @@ final class CommerceQueryParserConfig
|
||||
'verfügbarkeit',
|
||||
'verfuegbarkeit',
|
||||
];
|
||||
}
|
||||
|
||||
public function getHistoryContextPattern(): string
|
||||
{
|
||||
return 'chat|auch|noch|nochmal|zusätzlich|dazu|davon|stattdessen|alternative|alternativen|größer|groesser|kleiner|gleich(?:e|en|er|es)?|derselbe|dieselbe|dasselbe|wie oben|wie zuvor|wie gehabt';
|
||||
}
|
||||
|
||||
public function getHistoryContextValuePattern(): string
|
||||
{
|
||||
return '/\b(' . $this->getHistoryContextPattern() . ')\b/u';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getFilterSearchTokens(): array
|
||||
{
|
||||
return [
|
||||
private const FILTER_SEARCH_TOKENS = [
|
||||
'auch',
|
||||
'noch',
|
||||
'nochmal',
|
||||
@@ -142,14 +115,8 @@ final class CommerceQueryParserConfig
|
||||
'passen',
|
||||
'passend',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function getSearchTokenCorrections(): array
|
||||
{
|
||||
return [
|
||||
private const SEARCH_TOKEN_CORRECTIONS = [
|
||||
'siene' => 'seine',
|
||||
'sienen' => 'seinen',
|
||||
'siener' => 'seiner',
|
||||
@@ -157,14 +124,8 @@ final class CommerceQueryParserConfig
|
||||
'sienes' => 'seines',
|
||||
'indicatoren' => 'indikatoren',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function getSearchTokenCanonicalMap(): array
|
||||
{
|
||||
return [
|
||||
private const SEARCH_TOKEN_CANONICAL_MAP = [
|
||||
'indikatoren' => 'indikator',
|
||||
'indicators' => 'indikator',
|
||||
'indicator' => 'indikator',
|
||||
@@ -173,6 +134,113 @@ final class CommerceQueryParserConfig
|
||||
'reagent' => 'reagenz',
|
||||
'produkte' => 'produkt',
|
||||
];
|
||||
|
||||
private const SEMANTIC_SHOP_SEARCH_TOKENS = [
|
||||
'indikator',
|
||||
'indicator',
|
||||
'reagenz',
|
||||
'reagent',
|
||||
'zubehör',
|
||||
'zubehor',
|
||||
'ersatzteil',
|
||||
'verbrauchsmaterial',
|
||||
'chemie',
|
||||
'indikatorchemie',
|
||||
'reagenzchemie',
|
||||
'kit',
|
||||
'set',
|
||||
'filter',
|
||||
'pumpe',
|
||||
'pumpenkopf',
|
||||
'motorblock',
|
||||
'lösung',
|
||||
'loesung',
|
||||
'solution',
|
||||
'teststreifen',
|
||||
'gerät',
|
||||
'geraet',
|
||||
'messgerät',
|
||||
'messgeraet',
|
||||
'analysegerät',
|
||||
'analysegeraet',
|
||||
'analysator',
|
||||
'monitor',
|
||||
'controller',
|
||||
'system',
|
||||
];
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $config
|
||||
*/
|
||||
public function __construct(
|
||||
private readonly array $config = [],
|
||||
private readonly ?DomainVocabularyConfig $vocabulary = null,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getKnownBrands(): array
|
||||
{
|
||||
return $this->stringList(
|
||||
'known_brands',
|
||||
$this->vocabularyView('commerce_query.known_brands', self::KNOWN_BRANDS)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getPhrasesToRemove(): array
|
||||
{
|
||||
return $this->stringList(
|
||||
'phrases_to_remove',
|
||||
$this->vocabularyView('commerce_query.phrases_to_remove', self::PHRASES_TO_REMOVE)
|
||||
);
|
||||
}
|
||||
|
||||
public function getHistoryContextPattern(): string
|
||||
{
|
||||
return 'chat|auch|noch|nochmal|zusätzlich|dazu|davon|stattdessen|alternative|alternativen|größer|groesser|kleiner|gleich(?:e|en|er|es)?|derselbe|dieselbe|dasselbe|wie oben|wie zuvor|wie gehabt';
|
||||
}
|
||||
|
||||
public function getHistoryContextValuePattern(): string
|
||||
{
|
||||
return '/\b(' . $this->getHistoryContextPattern() . ')\b/u';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getFilterSearchTokens(): array
|
||||
{
|
||||
return $this->stringList(
|
||||
'filter_search_tokens',
|
||||
$this->vocabularyView('commerce_query.filter_search_tokens', self::FILTER_SEARCH_TOKENS)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function getSearchTokenCorrections(): array
|
||||
{
|
||||
return $this->stringMap(
|
||||
'search_token_corrections',
|
||||
$this->vocabularyStringMap('commerce_query.search_token_corrections', self::SEARCH_TOKEN_CORRECTIONS)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function getSearchTokenCanonicalMap(): array
|
||||
{
|
||||
return $this->stringMap(
|
||||
'search_token_canonical_map',
|
||||
$this->vocabularyStringMap('commerce_query.search_token_canonical', self::SEARCH_TOKEN_CANONICAL_MAP)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -335,39 +403,86 @@ final class CommerceQueryParserConfig
|
||||
*/
|
||||
public function getSemanticShopSearchTokens(): array
|
||||
{
|
||||
return [
|
||||
'indikator',
|
||||
'indicator',
|
||||
'reagenz',
|
||||
'reagent',
|
||||
'zubehör',
|
||||
'zubehor',
|
||||
'ersatzteil',
|
||||
'verbrauchsmaterial',
|
||||
'chemie',
|
||||
'indikatorchemie',
|
||||
'reagenzchemie',
|
||||
'kit',
|
||||
'set',
|
||||
'filter',
|
||||
'pumpe',
|
||||
'pumpenkopf',
|
||||
'motorblock',
|
||||
'lösung',
|
||||
'loesung',
|
||||
'solution',
|
||||
'teststreifen',
|
||||
'gerät',
|
||||
'geraet',
|
||||
'messgerät',
|
||||
'messgeraet',
|
||||
'analysegerät',
|
||||
'analysegeraet',
|
||||
'analysator',
|
||||
'monitor',
|
||||
'controller',
|
||||
'system',
|
||||
];
|
||||
return $this->stringList(
|
||||
'semantic_shop_search_tokens',
|
||||
$this->vocabularyView('commerce_query.semantic_shop_search_tokens', self::SEMANTIC_SHOP_SEARCH_TOKENS)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/** @return string[] */
|
||||
private function vocabularyView(string $path, array $fallback): array
|
||||
{
|
||||
return $this->vocabulary?->view($path, $fallback) ?? $fallback;
|
||||
}
|
||||
|
||||
/** @return array<string, string> */
|
||||
private function vocabularyStringMap(string $path, array $fallback): array
|
||||
{
|
||||
return $this->vocabulary?->stringMap($path, $fallback) ?? $fallback;
|
||||
}
|
||||
|
||||
/** @return string[] */
|
||||
private function stringList(string $path, array $default): array
|
||||
{
|
||||
$value = $this->value($path, $default);
|
||||
if (!is_array($value)) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
$out = [];
|
||||
foreach ($value as $item) {
|
||||
if (!is_scalar($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$item = trim((string) $item);
|
||||
if ($item === '' || in_array($item, $out, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$out[] = $item;
|
||||
}
|
||||
|
||||
return $out !== [] ? $out : $default;
|
||||
}
|
||||
|
||||
/** @return array<string, string> */
|
||||
private function stringMap(string $path, array $default): array
|
||||
{
|
||||
$value = $this->value($path, $default);
|
||||
if (!is_array($value)) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
$out = [];
|
||||
foreach ($value as $key => $item) {
|
||||
if (!is_scalar($key) || !is_scalar($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$cleanKey = trim((string) $key);
|
||||
$cleanValue = trim((string) $item);
|
||||
if ($cleanKey !== '' && $cleanValue !== '') {
|
||||
$out[$cleanKey] = $cleanValue;
|
||||
}
|
||||
}
|
||||
|
||||
return $out !== [] ? $out : $default;
|
||||
}
|
||||
|
||||
private function value(string $path, mixed $default): mixed
|
||||
{
|
||||
$current = $this->config;
|
||||
foreach (explode('.', $path) as $segment) {
|
||||
if (!is_array($current) || !array_key_exists($segment, $current)) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
$current = $current[$segment];
|
||||
}
|
||||
|
||||
return $current;
|
||||
}
|
||||
|
||||
public function buildExactTokenRemovalPattern(string $token): string
|
||||
|
||||
Reference in New Issue
Block a user