Я создаю веб-сайт с использованием Symfony 4.
Посетителям потребуется выполнить поиск по тысячам статей, упорядоченных по «dynamic_date».Я использую Elasticsearch 6.7, FOSElasticaBundle и JMS Serializer для индексации объектов «Article».
Сериализация, кажется, каким-то образом вводит в заблуждение ElasticSearch с точки зрения того, каким должен быть конечный индексированный тип, и это мешает мне сортировать результаты поиска.
Как я могу указать это, либо в файле конфигурации, либо с аннотациями?
Я попытался использовать аннотацию @Type, чтобы принудительно ввести ее в правильный тип.
Конфигурация FOSElasticaBundlefile:
fos_elastica:
serializer:
serializer: jms_serializer
...
articles:
types:
article:
serializer:
groups: [elastica]
Article Entity:
use JMS\Serializer\Annotation as Serializer;
...
/**
* @Serializer\Type("DateTimeImmutable")
* @Serializer\Groups({"article_show", "list", "elastica"})
* @var \DateTimeImmutable
* @Gedmo\Timestampable(on="change", field="state", value="published" )
* @ORM\Column( name="dynamic_date", type="datetimetz_immutable", nullable=true)
*/
protected $dynamic_date ;
ArticlesSearchRepository:
$query = new \Elastica\Query( $boolQuery ) ;
$query -> addSort
(
array
(
'dynamic_date' => array( 'order' => 'desc' )
)
);
Однако, проверяя http://local:9200/articles, я вижу, что этовсегда заканчивается индексацией как «текстового» типа вместо «даты», что приводит к следующей ошибке:
Fielddata по умолчанию отключен в текстовых полях.Установите fielddata = true на> [dynamic_date], чтобы загрузить полевые данные в память путем инвертирования> инвертированного индекса.Обратите внимание, что для этого может потребоваться значительная память
, тогда как при ручной настройке (без использования сериализатора) она работает как положено, например:
articles:
types:
article:
properties:
dynamic_date:
type: "date"
Я хотел бысохраняйте преимущества использования JMS Serializer.