我正在尝试设置父子关系,我似乎无法正确地获得映射配置。我正在使用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]]
我已经尝试指定上面注释掉的路由,但是也没有设置关系,我已经将路由删除了,因为文档中没有提到它。 谁能看到我错在哪里?
答案 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 不知道在哪里存储应该有父文件的文档 没有指定它。