2016-07-10 9 views
0

Ich habe FOSlaslasticaBundle in meinem Symfony-Projekt. Ich habe ein Unternehmen mit ElasticaBundle abgebildet, die einige „einfache Felder“, wieFlatting FOS ElasticaBundle verschachtelte Felder

mappings: 
createdAt: 
    type: "date" 

und anderen Bereichen hat, die IDs sind (wie owner_id) an andere Unternehmen zu korrelieren, wie

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

weil ich brauche um den Benutzernamen mit ES/Kibana durchsuchbar zu machen. Dies funktioniert, aber es hat natürlich ein verschachteltes Feld "owner.fullname" erstellt und diese Art von Feldern kann nicht mit Kibana durchsucht werden (seit Jahren gibt es Anfragen dazu).
Also frage ich: gibt es eine Möglichkeit, dieses Feld zu flattern, so dass ich ein einfaches einfaches String-Feld in ES namens "owner_fullname" ohne verschachtelte Daten habe?
Danke

Antwort

0

Antwort auf selbst.
Sie können in Ihrer Klasse eine Methode erstellen (oder wo möglich verwenden), um Informationen über verwandte Klassen zurückzugeben.
Also, wenn Sie eine User-Klasse in mehrere Adressklassen bezogene Benutzeradressen zu speichern, und Sie wollen in IHM speichern den Standard ein, können Sie eine Methode „getDefaultAddress“ in User-Klasse, so etwas wie

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

mappen Sie es dann zu einem Feld mit elastica Bundle und verwenden Sie den Deskriptor "property_path:", um elastica zu sagen, wo der Inhalt für dieses Feld abgerufen werden soll.
Auf diese Weise haben Sie ein einfaches Feld in ES und nicht ein geschachteltes.
Ich bin nicht sicher, dass ich diese Philosophie mag, weil Sie Code und externe Persistenz-Ebenen verwechseln, aber es funktioniert, ist klar und einfach zu pflegen, vor allem, wenn Sie dedizierte Methoden mit dem gleichen Präfix in Ihrer Klasse erstellen, wie es GetAddress, es GetPlace und so weiter.

Verwandte Themen