使用 FOSelastica TransformEvent 定义 elasticsearch 字段类型

Define elasticsearch field type using FOSelastica TransformEvent

我正在处理一个使用 FOS Elastica Bundle 的现有 Symfony 项目,尤其是 TransformEvent。

elastica.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'
    );
}

我想将 'elements' 索引为嵌套的,就像 here 所解释的那样,但我不知道该怎么做。我试图更改 elastica.yml 中的映射但没有成功。 例如,这个 returns 错误:

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

=> Object of class Bundle\Entity\Element could not be converted to a string

所以,我想知道是否可以在 $document->set( 'elements', $elements ) 期间将 'elements' 类型定义为 'nested'; ?

感谢您的帮助!

字段 "elements"(我想设置为 "nested")在 "model" (Bundle\Entity\Object) 中不存在。但是,由于我使用此模型进行映射,因此必须如此。

TransformEvent 允许将自定义字段添加到映射中,但在这种情况下,它们的类型会自动设置。

我只需要在模型中放入一个新的 属性(没有注释,因为我不希望 属性 出现在数据库中)

Bundle\Entity\对象

/** some properties **/ 

private $elements;

/**
* Constructor stuff
**/

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

elastica.yml

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

我不知道这是否是使用 TransformEvent 的正确方法,但它对我有用。