展平FOS ElasticaBundle嵌套字段

时间:2016-07-10 15:07:25

标签: symfony kibana-4 foselasticabundle

我的Symfony项目中有FOSElasticaBundle。我有一个用ElasticaBundle映射的实体,它有一些“简单字段”,比如

mappings:
 createdAt:
    type: "date"

以及与其他实体关联的ID(如owner_id)的其他字段,例如

owner:                   
     type: "nested"
     properties:
          fullname:
          type: string
          index: not_analyzed

因为我需要使用ES / Kibana搜索用户全名。这有效,但它当然创建了一个嵌套字段“owner.fullname”,这种字段无法与Kibana一起搜索(这是多年来有关它的请求)。
所以我问:有没有办法让那个字段变平,这样我在ES中有一个简单的普通字符串字段,名为“owner_fullname”,没有嵌套数据?
感谢

1 个答案:

答案 0 :(得分:0)

回答自己。
您可以在类中创建一个方法(或在可能的情况下使用现有方法)来返回有关相关类的信息 因此,如果您有一个与几个Address类相关的User类来存储用户的地址,并且您希望在ES中存储默认地址,则可以创建一个方法" getDefaultAddress"在User类中,类似于

public function getDefaultAddress() {
    return $this->addresses->getDefault()->getFormattedFlatString()
}

然后将其映射到带有elastica Bundle的字段,并使用" property_path:"描述符告诉elastica在哪里获取该字段的内容。
通过这种方式,您在ES中有一个简单的字段,而不是嵌套的字段 我不确定我喜欢这种理念,因为你混淆了代码和外部持久层,但它很有效,很容易维护,特别是如果你在类中创建具有相同前缀的专用方法,比如 es < / strong> GetAddress, es GetPlace等。