2016-06-10 28 views
1

在我們的symfony2項目中,我們希望使用ongr-io綁定來實現elasticsearch,但是我們的整個系統是建立在教義上的。是否有可能以某種方式使用ongr-io elasticsearch bundle而不用完全重做整個數據庫而不是實體的文檔?ongr-io彈性搜索綁定實現與教條symfony2

實體,我想指數(搜索領域將是:姓名,ChildCategory和ParentCategory):

/** 
* 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; 
    } 

回答

0

這是非常有趣的。

第一件事是實體的位置。 ElasticsearchBundle的文檔必須位於Document目錄中。沒什麼大不了的。您只需要創建一個空類並使用@Document註釋擴展實體。接下來是領域。隨着name領域沒有任何問題,只需添加@property註釋,你很好。更有趣的是與關係。我的建議是創建單獨的屬性和來自該字段關係的getter返回值。我希望你明白了。

更新:

下面是文檔的例子:

的appbundle /實體/後

<?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 /文件/後

<?php 

namespace AppBundle\Document; 

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

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

謝謝您的回覆。如果我理解你的話,我只需要在Document文件夾中創建一個空的類,並且繼續對已有的實體做所有事情,但是如果我這樣做,我會收到一個錯誤:「」CoreBundle \ Document \ Course「類不能解析爲文檔,因爲缺少@Document註釋。「它只有在我將這個類作爲文檔擴展時才起作用,但是它不會僅僅在這個空的文檔類中查找字段嗎? –

+0

我想,我誤解了你想做的事情。如果你想堅持教條實體的Elasticsearch,這將無濟於事。如果你將有一個單獨的類,你仍然需要從實體中填充值。爲什麼不簡單地創建單獨的文檔,只需要那些你需要的字段呢? – saimaz

+0

但是這種重複性會不會影響性能和存儲使用量? –