我的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”,没有嵌套数据?
感谢
答案 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等。