Определите тип поля elasticsearch с помощью FOSelastica TransformEvent

Я работаю над существующим проектом Symfony, который использует FOS Elastica Bundle и особенно TransformEvent.

эластика.yml

    types:
         object:        
             mappings: ~
             persistence:
                identifier: id
                driver: orm
                model: Bundle\Entity\Object
                listener: ~
                provider: ~
                finder: ~

слушатель

public function addCustomProperties(TransformEvent $event)
{   
    $document = $event->getDocument();
    $object = $event->getObject();

    /* elements */
    $elementsList = $object->getElements();
    $elements = [];
    foreach($elementsList as $element)
    {
        $elements[] = array(
            'id' => $element->getId(),
            'value' => $element->getValue(),
            'type' => $element->getType()
    }

   $document->set( 'elements', $elements );

}

public static function getSubscribedEvents() {
    return array(
            TransformEvent::POST_TRANSFORM => 'addCustomProperties'
    );
}

Я хотел бы индексировать «элементы» как вложенные, как это объясняется здесь, но я не могу понять, как это сделать. Я безуспешно пытался изменить сопоставление в elastica.yml. Например, это возвращает ошибку:

types:
     object:        
         mappings: 
            elements:
               type: nested
         etc.

=> Объект класса Bundle\Entity\Element не может быть преобразован в строку

Итак, мне было интересно, можно ли определить тип «элементов» как «вложенный» во время $document->set('elements', $elements); ?

Спасибо за любую помощь!


person G.P    schedule 30.08.2017    source источник
comment
Отображение elasticsearch по умолчанию должно заботиться о вашем вложенном типе. Можете ли вы опубликовать один образец документа, который вы пытаетесь проиндексировать?   -  person Jai Sharma    schedule 30.08.2017
comment
Ваш комментарий заставил меня найти проблему, спасибо;) Я отвечаю ниже, на случай, если другие люди столкнутся с той же проблемой.   -  person G.P    schedule 31.08.2017


Ответы (1)


Поле «элементы» (которое я хотел установить как «вложенное») не существовало в «модели» (Bundle\Entity\Object). Однако так и должно было быть, поскольку я использую эту модель для отображения.

TransformEvent позволяет добавлять в отображение настраиваемые поля, но в этом случае их тип устанавливается автоматически.

Мне просто нужно было добавить новое свойство в модель (без аннотаций, потому что я не хочу, чтобы это свойство было в базе данных)

Пакет\Сущность\Объект

/** some properties **/ 

private $elements;

/**
* Constructor stuff
**/

/**
* Set elements
*/
public function getElements()
{
    return $this->elements;
}

эластика.yml

types:
     object:        
         mappings:
            elements:
                type: nested
         # etc.

Я не знаю, подходит ли это для использования TransformEvent, но мне это помогло.

person G.P    schedule 31.08.2017