2016-06-10 5 views
1

In unserem symfony2 Projekt wollen wir elasticsearch mit ongr-io bundle implementieren, aber unser ganzes System baut auf Doktrin auf. Ist es irgendwie möglich, ongr-io elasticsearch bundle zu verwenden, ohne die gesamte Datenbank mit Dokumenten anstelle von Entitäten komplett neu zu erstellen?ongr-io elasticsearch bundle implementation mit doctrine symfony2

Entity, die ich indizieren möchten (Felder für die Suche wäre: Name, ChildCategory und parent):

/** 
* Course 
* 
* @ORM\Table(name="course") 
* @ORM\Entity(repositoryClass="CoreBundle\Repository\CourseRepository") 
* @ORM\HasLifecycleCallbacks 
*/ 
    class Course 
    { 
     /** 
     * @var int 
     * 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 

     /** 
     * @var string 
     * 
     * @ORM\Column(name="name", type="string", length=255, unique=false) 
     */ 
     private $name; 

     /** 
     * @var ParentCategory 
     * 
     * @ORM\ManyToOne(targetEntity="ParentCategory") 
     * @ORM\JoinColumn(name="parentCategory_id", referencedColumnName="id") 
     */ 
     private $parentCategory; 

     /** 
     * @var ChildCategory 
     * 
     * @ORM\ManyToOne(targetEntity="ChildCategory", inversedBy="courses") 
     * @ORM\JoinColumn(name="childCategory_id", referencedColumnName="id") 
     */ 
     private $childCategory; 

     /** 
     * @var City 
     * 
     * @ORM\ManyToOne(targetEntity="City") 
     * @ORM\JoinColumn(name="city_id", referencedColumnName="id") 
     */ 
     private $city; 

     /** 
     * @var Users 
     * 
     * @ORM\ManyToOne(targetEntity="UserBundle\Entity\Users", inversedBy="course") 
     * @ORM\JoinColumn(name="owner_id", referencedColumnName="id") 
     */ 
     private $owner; 

     /** 
     * @var text 
     * 
     * @ORM\Column(name="description", type="text") 
     */ 
     private $description; 

     /** 
     * @var Picture 
     * 
     * @ORM\OneToMany(targetEntity="CoreBundle\Entity\Picture", mappedBy="course", cascade={"persist", "remove"}) 
     */ 
     private $pictures; 

     /** 
     * @var Ratings 
     * 
     * @ORM\OneToMany(targetEntity="CoreBundle\Entity\Ratings", mappedBy="courseid") 
     */ 
     private $ratings; 

     public $avgRating; 
    } 

Antwort

0

es ist sehr interessant.

Die erste Sache ist Standort der Entität. Das Dokument für ElasticsearchBundle muss sich im Verzeichnis Document befinden. Es ist keine große Sache. Sie müssen lediglich eine leere Klasse erstellen und die Entität mit @Document Annotation erweitern. Als nächstes sind die Felder. Mit name Feld gibt es kein Problem, fügen Sie einfach @property Annotation hinzu und Sie sind gut. Interessanter ist mit Beziehungen. Mein Vorschlag wäre, separate Eigenschaft und im Getter-Rückgabewert aus der Beziehung für dieses Feld zu erstellen. Ich hoffe, du hast die Idee.

Update:

Hier ist ein Beispiel von Dokumenten:

AppBundle/Entity/Post

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use ONGR\ElasticsearchBundle\Annotation as ES; 

/** 
* Post 
* 
* @ORM\Table(name="post") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository") 
*/ 
class Post 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ES\Property(type="string") 
    * @ORM\Column(name="title", type="string", length=255, nullable=true) 
    */ 
    private $title; 

    /** 
    * @var User 
    * 
    * @ORM\ManyToOne(targetEntity="User") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $user; 

    /** 
    * @var string 
    * 
    * @ES\Property(name="user", type="string") 
    */ 
    private $esUser; 

    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set title 
    * 
    * @param string $title 
    * 
    * @return Post 
    */ 
    public function setTitle($title) 
    { 
     $this->title = $title; 

     return $this; 
    } 

    /** 
    * Get title 
    * 
    * @return string 
    */ 
    public function getTitle() 
    { 
     return $this->title; 
    } 

    /** 
    * Set user 
    * 
    * @param \AppBundle\Entity\User $user 
    * 
    * @return Post 
    */ 
    public function setUser(\AppBundle\Entity\User $user = null) 
    { 
     $this->user = $user; 

     return $this; 
    } 

    /** 
    * Get user 
    * 
    * @return \AppBundle\Entity\User 
    */ 
    public function getUser() 
    { 
     return $this->user; 
    } 

    /** 
    * @return string 
    */ 
    public function getEsUser() 
    { 
     return $this->esUser; 
    } 

    /** 
    * @param string $esUser 
    */ 
    public function setEsUser($esUser) 
    { 
     $this->esUser = $esUser; 
    } 
} 

AppBundle/File/Post

<?php 

namespace AppBundle\Document; 

use ONGR\ElasticsearchBundle\Annotation as ES; 
use AppBundle\Entity\Post as OldPost; 

/** 
* @ES\Document() 
*/ 
class Post extends OldPost 
{ 
} 
+0

Dank für Ihre Antwort danken . Wenn ich dich richtig verstehe, dann muss ich einfach eine leere Klasse im Dokumentenordner erstellen und alles auf der Entität machen, die ich bereits habe, aber wenn ich das tue, erhalte ich einen Fehler: "" CoreBundle \ Document \ Course "Klasse kann nicht sein als Dokument analysiert, weil @ Document Annotation fehlt. " Es funktioniert nur, wenn ich diese Klasse auch als Dokument erweitere, aber wird dann nicht einfach nach Feldern in dieser leeren Dokumentklasse gesucht? –

+0

Ich denke, ich habe falsch verstanden, was Sie tun möchten. Wenn Sie eine Doktrinsentität für Elasticsearch beibehalten möchten, die nicht hilft. Wenn Sie eine separate Klasse haben, müssen Sie dennoch Werte von der Entität eingeben. Warum nicht einfach ein separates Dokument mit nur den benötigten Feldern erstellen? – saimaz

+0

Aber wird sich diese Art von Duplikation nicht zu sehr auf die Leistung und die Speichernutzung auswirken? –