2016-07-10 30 views
0

我的Symfony項目中有FOSElasticaBundle。我有ElasticaBundle是一個實體,它有一些「簡單的領域」,那樣的人的ID(如owner_id)平坦FOS ElasticaBundle嵌套字段

mappings: 
createdAt: 
    type: "date" 

等領域關聯到其他實體,如

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

,因爲我需要讓用戶全名可以用ES/Kibana進行搜索。這有效,但它創建了一個嵌套字段「owner.fullname」,這種類型的字段不能用Kibana進行搜索(這是因爲多年來有關於它的請求)。
所以我問:有沒有辦法平整該字段,以便ES中有一個簡單的純字符串字段,名爲「owner_fullname」,沒有嵌套數據?
謝謝

回答

0

回答自我。
您可以在您的課程中創建一個方法(或儘可能使用現有方法)以返回有關相關課程的信息。
所以如果你有相關的幾個地址類用戶類來存儲用戶的地址,並且要在ES存儲默認的,你可以創建在用戶類中的方法「getDefaultAddress」,像

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

然後將其映射到帶有elastica Bundle的字段並使用「property_path:」描述符告訴elastica在哪裏獲取該字段的內容。
用這種方法,你在ES中有一個簡單的字段,而不是嵌套的字段。
我不確定我喜歡這種理念,因爲你混淆了代碼和外部持久層,但它的工作原理很清晰易於維護,尤其是如果你在你的類中創建了具有相同前綴的專用方法,如es GetAddress, es GetPlace等。