无法使用FOSElasticaBundle设置父子项

时间:2015-04-10 13:17:11

标签: symfony elasticsearch foselasticabundle

我正在尝试设置父子关系,我似乎无法正确地获得映射配置。我正在使用Symfony2.5,FOSElastica 3.0.9和Elasticsearch 1.4.4

以下是我的映射的相关部分:

# fos elastica
fos_elastica:
    clients:
        default: { host: 127.0.0.1, port: 9200 }
    serializer: 
        callback_class: FOS\ElasticaBundle\Serializer\Callback
        serializer: serializer
    indexes:
        index:
            index_name: index_%kernel.environment%
            client: default
            types:
                company:
                    mappings:
                        id: 
                            type: "long"
                        company_name: 
                            type: "string"
                            fields:
                                raw:
                                    type: "string"
                                    index: "analyzed"
                                    index_analyzer: "sortable"
                    persistence:
                        elastica_to_model_transformer:
                            ignore_missing: true
                        driver: orm # orm, mongodb, propel are available
                        model: Alpha\RMSBundle\Entity\Company
                        provider: ~
                        finder: ~
                        listener: ~
                    serializer: 
                        groups: [company]
                job:
                    mappings:
                        id:
                            type: "long"
                        company:
                            type: "object"
                            properties:
                                id:
                                    type: "long"
                    _parent:
                        type: company
                        property: company
                        identifier: id
                    #_routing:
                    #    required: true
                    #    path: company
                    persistence:
                        elastica_to_model_transformer:
                            ignore_missing: true
                        driver: orm # orm, mongodb, propel are available
                        model: Alpha\RMSBundle\Entity\JobOpening
                        provider: ~
                        finder: ~
                        listener: ~
                    serializer: 
                        groups: [job]

首先我填充公司,但当我尝试填充工作时,我收到以下错误:

    [Elastica\Exception\ResponseException]                                 
  RoutingMissingException[routing is required for [index_v2]/[job]/[1]]

我已经尝试指定上面注释掉的路由,但是也没有设置关系,我已经将路由删除了,因为文档中没有提到它。 谁能看到我错在哪里?

2 个答案:

答案 0 :(得分:2)

上面的映射没有问题,并且不需要_routing。但是,FOSElastica不会使用_parent设置填充映射。

但是,正如docs所说,你需要在Document上使用setParent。为此,我需要设置一个自定义的ModelToElasticaTransformer。这可以通过扩展类Alpha \ RMSBundle \ Transformer \ JobToElasticaTransformer

中的bundle提供的ModelToElasticaAutoTransformer来完成。

在transform()函数中我插入了一行:

$document->setParent($object->getCompany()->getId());

正好在

之上
return $document

然后你宣布服务:

alpha.transformers.model.job:
    class:  Alpha\RMSBundle\Transformer\JobToElasticaTransformer
        calls:
            - [ setPropertyAccessor, ['@fos_elastica.property_accessor'] ]

最后在持久性部分中的类型映射中添加以下内容:

model_to_elastica_transformer:
    service: alpha.transformers.model.job

现在你可以正常使用populate,只要你记得首先填充父类

答案 1 :(得分:1)

该捆绑包在documentation

中非常清楚地解释了这一点
  

请注意,要创建包含父级的文档,您需要调用   setParent在文档上而不是设置_parent字段。如果你   如果做错了,您会看到RoutingMissingException为Elasticsearch   不知道在哪里存储应该有父文件的文档   没有指定它。