Skip to content

Commit

Permalink
databox: add dynamic templates for ES (#446)
Browse files Browse the repository at this point in the history
  • Loading branch information
4rthem authored Aug 19, 2024
1 parent 2c863f6 commit 94ff8c2
Show file tree
Hide file tree
Showing 21 changed files with 197 additions and 421 deletions.
2 changes: 1 addition & 1 deletion databox/api/config/packages/fos_elastica.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ fos_elastica:
analyzer: partial_words
search_analyzer: text
term_vector: with_positions_offsets
attributes:
!php/const App\Attribute\AttributeInterface::ATTRIBUTES_FIELD:
type: object
referenceCollectionId:
type: keyword
Expand Down
4 changes: 0 additions & 4 deletions databox/api/config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,6 @@ services:
$signingKey: '%env(APP_SECRET)%'
$ttl: 86400

App\Elasticsearch\Mapping\IndexMappingUpdater:
arguments:
$index: '@fos_elastica.index.asset'

App\Elasticsearch\Mapping\ElasticsearchClient:
arguments:
$client: '@fos_elastica.client'
Expand Down
2 changes: 1 addition & 1 deletion databox/api/src/Attribute/AttributeInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@

interface AttributeInterface
{
final public const ATTRIBUTES_FIELD = 'attributes';
final public const ATTRIBUTES_FIELD = 'attrs';
final public const NO_LOCALE = '_';
}
46 changes: 46 additions & 0 deletions databox/api/src/Attribute/AttributeLocaleInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace App\Attribute;

interface AttributeLocaleInterface
{
final public const LOCALES = [
'ar' => 'arabic',
'bg' => 'bulgarian',
'bn' => 'bengali',
'ca' => 'catalan',
'ch' => 'cjk',
'ckb' => 'sorani',
'cs' => 'czech',
'da' => 'danish',
'de' => 'german',
'el' => 'greek',
'en' => 'english',
'es' => 'spanish',
'et' => 'estonian',
'eu' => 'basque',
'fa' => 'persian',
'fi' => 'finnish',
'fr' => 'french',
'ga' => 'irish',
'gl' => 'galician',
'hi' => 'hindi',
'hu' => 'hungarian',
'hy' => 'armenian',
'id' => 'indonesian',
'it' => 'italian',
'ja' => 'cjk',
'ko' => 'cjk',
'lt' => 'lithuanian',
'lv' => 'latvian',
'nl' => 'dutch',
'no' => 'norwegian',
'pt' => 'portuguese',
'pt_BR' => 'brazilian',
'ro' => 'romanian',
'ru' => 'russian',
'sv' => 'swedish',
'th' => 'thai',
'tr' => 'turkish',
];
}
7 changes: 6 additions & 1 deletion databox/api/src/Attribute/Type/AbstractAttributeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ public function getFacetType(): string
return ESFacetInterface::TYPE_TEXT;
}

public function isMappingLocaleAware(): bool
{
return false;
}

public function isLocaleAware(): bool
{
return false;
Expand All @@ -72,7 +77,7 @@ public function getGroupValueLabel($value): ?string
return (string) $value;
}

public function getElasticSearchMapping(string $locale, AttributeDefinition $definition): array
public function getElasticSearchMapping(string $locale): ?array
{
return [];
}
Expand Down
3 changes: 2 additions & 1 deletion databox/api/src/Attribute/Type/AttributeTypeInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public function createFilterQuery(string $field, $value): AbstractQuery;

public function supportsAggregation(): bool;

public function getElasticSearchMapping(string $locale, AttributeDefinition $definition): array;
public function getElasticSearchMapping(string $locale): ?array;

/**
* Normalize value for database.
Expand All @@ -58,6 +58,7 @@ public function denormalizeElasticsearchValue(mixed $value): ?string;
*/
public function normalizeElasticsearchValue(?string $value);

public function isMappingLocaleAware(): bool;
public function isLocaleAware(): bool;

public function supportsSuggest(): bool;
Expand Down
5 changes: 5 additions & 0 deletions databox/api/src/Attribute/Type/CodeAttributeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,9 @@ public static function getName(): string
{
return 'code';
}

public function isMappingLocaleAware(): bool
{
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ public function createFilterQuery(string $field, $value): AbstractQuery
return new Query\Terms($field, $value);
}

public function getElasticSearchMapping(string $locale, AttributeDefinition $definition): array
public function getElasticSearchMapping(string $locale): ?array
{
throw new \LogicException('Should never be called');
return null;
}

public function isLocaleAware(): bool
Expand Down
2 changes: 1 addition & 1 deletion databox/api/src/Attribute/Type/DateTimeAttributeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public function getElasticSearchType(): string
return 'date';
}

public function getElasticSearchMapping(string $locale, AttributeDefinition $definition): array
public function getElasticSearchMapping(string $locale): ?array
{
return [
'fields' => [
Expand Down
10 changes: 5 additions & 5 deletions databox/api/src/Attribute/Type/EntityAttributeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,20 +109,20 @@ public function denormalizeValue(?string $value): ?array
];
}

public function getElasticSearchMapping(string $locale, AttributeDefinition $definition): array
public function getElasticSearchMapping(string $locale): ?array
{
$mapping = parent::getElasticSearchMapping($locale, $definition);
$mapping = parent::getElasticSearchMapping($locale);

return [
'type' => 'object',
'properties' => [
'id' => [
'type' => 'keyword',
],
'value' => [
...$mapping,
'type' => $this->getElasticSearchType(),
],
'id' => [
'type' => 'keyword',
],
],
];
}
Expand Down
2 changes: 1 addition & 1 deletion databox/api/src/Attribute/Type/NumberAttributeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public static function getName(): string
return self::NAME;
}

public function getElasticSearchMapping(string $locale, AttributeDefinition $definition): array
public function getElasticSearchMapping(string $locale): ?array
{
return [
'fields' => [
Expand Down
68 changes: 15 additions & 53 deletions databox/api/src/Attribute/Type/TextAttributeType.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace App\Attribute\Type;

use Alchemy\CoreBundle\Util\LocaleUtil;
use App\Attribute\AttributeLocaleInterface;
use App\Elasticsearch\SearchType;
use App\Entity\Core\AttributeDefinition;
use Elastica\Query;
Expand Down Expand Up @@ -40,73 +41,34 @@ public function createFilterQuery(string $field, $value): AbstractQuery
return new Query\Terms($field, $value);
}

public function getElasticSearchMapping(string $locale, AttributeDefinition $definition): array
public function getElasticSearchMapping(string $locale): ?array
{
$mapping = [];

if (true
// TODO Should always provision keyword?
|| $definition->isFacetEnabled()) {
$mapping['fields'] = [
$mapping = [
'fields' => [
'raw' => [
'type' => 'keyword',
'ignore_above' => 500,
'ignore_above' => 256,
],
];
}

$locales = [
'ar' => 'arabic',
'bg' => 'bulgarian',
'bn' => 'bengali',
'ca' => 'catalan',
'ch' => 'cjk',
'ckb' => 'sorani',
'cs' => 'czech',
'da' => 'danish',
'de' => 'german',
'el' => 'greek',
'en' => 'english',
'es' => 'spanish',
'et' => 'estonian',
'eu' => 'basque',
'fa' => 'persian',
'fi' => 'finnish',
'fr' => 'french',
'ga' => 'irish',
'gl' => 'galician',
'hi' => 'hindi',
'hu' => 'hungarian',
'hy' => 'armenian',
'id' => 'indonesian',
'it' => 'italian',
'ja' => 'cjk',
'ko' => 'cjk',
'lt' => 'lithuanian',
'lv' => 'latvian',
'nl' => 'dutch',
'no' => 'norwegian',
'pt' => 'portuguese',
'pt_BR' => 'brazilian',
'ro' => 'romanian',
'ru' => 'russian',
'sv' => 'swedish',
'th' => 'thai',
'tr' => 'turkish',
],
];

$language = LocaleUtil::extractLanguageFromLocale($locale);
if (isset($locales[$locale])) {
$mapping['analyzer'] = $locales[$locale];
} elseif (isset($locales[$language])) {
$mapping['analyzer'] = $locales[$language];
if (isset(AttributeLocaleInterface::LOCALES[$locale])) {
$mapping['analyzer'] = AttributeLocaleInterface::LOCALES[$locale];
} elseif (isset(AttributeLocaleInterface::LOCALES[$language])) {
$mapping['analyzer'] = AttributeLocaleInterface::LOCALES[$language];
} else {
$mapping['analyzer'] = 'text';
}

return $mapping;
}

public function isMappingLocaleAware(): bool
{
return $this->isLocaleAware();
}

public function isLocaleAware(): bool
{
return true;
Expand Down
58 changes: 0 additions & 58 deletions databox/api/src/Command/SynchronizeESMappingCommand.php

This file was deleted.

This file was deleted.

This file was deleted.

Loading

0 comments on commit 94ff8c2

Please sign in to comment.