Как сериализовать свойство datetime объекта в тип эластичного поиска date, а не text - PullRequest
1 голос
/ 19 мая 2019

Я создаю веб-сайт с использованием 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.

...