使用FOSelastica TransformEvent定义elasticsearch字段类型

时间:2017-08-30 14:45:35

标签: symfony elasticsearch foselasticabundle

我正在开发一个使用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中的映射而没有成功。 例如,这会返回错误:

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

=> Bundle \ Entity \ Element类的对象无法转换为字符串

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

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

字段"元素" (我希望设置为"嵌套")并不存在于"模型" (束\实体\对象)。但是,必须如此,因为我使用此模型进行映射。

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

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

Bundle \ Entity \ Object

/** some properties **/ 

private $elements;

/**
* Constructor stuff
**/

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

elastica.yml

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

我不知道这是否适合使用TransformEvent,但它对我有用。