2

我正在尝试设置父子关系,但似乎无法正确设置映射配置。我正在使用 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]]

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

4

2 回答 2

2

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

但是,正如文档所说,您需要在文档上使用 setParent。为此,我需要设置一个自定义 ModelToElasticaTransformer。这可以通过扩展包中提供的 ModelToElasticaAutoTransformer 类 Alpha\RMSBundle\Transformer\JobToElasticaTransformer 来完成

在 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

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

于 2015-04-16T08:48:45.957 回答
1

该捆绑包在其文档中非常清楚地解释了这一点

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

于 2015-04-10T22:46:07.800 回答