2013-10-30 11 views
12

:スキーマにフルテキストインデックスを削除しないでください。私たちは、定期的にそのテーブルに当社の生産データセットをコピーして、テーブルの構造をマッピングし、実際のエンティティに関連付けられているSearchEntityを作成しています。だから我々は(ステートメントビルダーAGAINSTカスタムMATCHを使用して)私たちのSearchRepositoryにGoogleの検索クエリを実行し、関連付けを解決したエンティティを取得することができます。Symfony2の/ Doctrine2:私はMyISAMテーブルミラーテーブルを使用Symfony2の中でフルテキストインデックス作成をサポートするために更新

さて、私はdoctrine:schema:updateを実行するとDoctrine2は、そのテーブルの上に(手動で追加)インデックスを認識し、それらをドロップしたいと考えていません。残念ながら、「しかし、そのままこのインデックスを残して!」と言う何のアドバイスアノテーションはありません。

@Index注釈を全文索引(ft_の接頭辞)と同じフィールドで使用してDoctrineをトリックしてから、手動でSQLを実行してFT索引に置き換えようとしましたが、それも失敗します。Doctrineが最初に作成するときこれらのダミーインデックスを持つテーブルは、インデックスキーの長さが1000バイトを超えているために失敗します(これはMySQLの明白な理由によるハード制限です)。

質問:Doctrineには、 schema:updateコマンドにそのまま反映されますか?それをフレームワークにハッキングする方法はありますか?これは、各スキーマの更新後にフルテキストインデックスを再作成するextremeley面倒だ:(

SearchEntity:tmp_searchインデックスを作成するための

/** 
* @ORM\Table(name="tmp_search2",options={"engine"="MyISAM"}, 
*   uniqueConstraints={@ORM\UniqueConstraint(name="uq",columns={"language_id","product_offer_id","product_group_id","retailer_id"})}, 
    *   indexes={@Index(name="price_idx", columns={"product_offer_price"}), 
    *      @Index(name="started_at_idx", columns={"product_offer_started_at"}), 
    *      @Index(name="ended_at_idx", columns={"product_offer_ended_at"}), 
    *      @Index(name="ft_products", columns={"product_name"}), 
    *      @Index(name="ft_product_group", columns={"product_group_name"}), 
    *      @Index(name="ft_product_retailer", columns={"retailer_name"}) 
    *   } 
    *) 
    * @ORM\Entity(repositoryClass="SearchRepository") 
    */ 

class SearchEntity 
{ 
    /** 
    * This field is only here to satisfy doctrine's need for a non-composite primary key. 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $searchId; 

    /** 
    * @ORM\ManyToOne(targetEntity="ProductOffer") 
    * @ORM\JoinColumn(name="product_offer_id", referencedColumnName="id") 
    */ 
    private $productOffer; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="product_offer_price", type="integer") 
    */ 
    private $price; 

SQL(まず私たちを作成し、そこに残さ何教義ドロップ)

DROP INDEX ft_products ON tmp_search2; 
DROP INDEX ft_product_group ON tmp_search2; 
DROP INDEX ft_product_retailer ON tmp_search2; 

# import product data and then... 

CREATE FULLTEXT INDEX ft_products ON tmp_search2 (product_name,product_short_text,product_long_text); 
CREATE FULLTEXT INDEX ft_product_group ON tmp_search2 (product_group_name); 
CREATE FULLTEXT INDEX ft_product_retailer ON tmp_search2 (retailer_name); 
+0

これは直接的な解決策ではありませんが、内部的に 'doctrine:schema:update'を実行し、独自のSQLを実行して追加のインデックスを作成する独自のコンソールコマンドを作成することができます – JamesHalsall

+0

だからdoctrine:schema :自分自身をもう一度更新しますか?いいえ、私はそれがフレームワークに属すると思うし、そこには良い(誰もがそれがうまくいくとは分かっています。 Doctrineの側には実際にそれを修正するためのいくつかの作業があると思います。 Doctrineの型を(好ましくはバンドルを使って)拡張するための方法があるかもしれません。 – Stefan

+1

Doctrine 2.5には "フラグ"オプションがあります。 "fullltext"に設定すると、ftインデックスを自動的に作成することができます:http://stackoverflow.com/questions/23448266/add-a-fulltext-index-in-doctrine-2-using-annotations – Stefan

答えて

0
  1. あなたは教義を使用しないでください:スキーマ:生産の更新を代わりにマイグレーションを使用し
  2. 私は教義を覚えていたよう。 2 MyISAMのフルサポートしていませんが、あなたがそれを手動でテーブルを作成して使用することができます
  3. MySQLの全文検索では、検索のための最高のチョイスではありません。たぶん、あなたの仕事にとってSphinxやLuceneはもっと適切な解決策でしょうか?
+0

1.我々大規模な移行プロセスの途中で毎日データを移行する - >大部分が変更されるため、大部分のデータをインポートする必要があるため、データベースを再作成することは問題ではありません。 2. Doctrineは、MyISAMを使用するためにエンティティのテーブルに注釈を付けることしかできません。テーブルは自動的に生成されますが、明らかに欠けている外部キーがコマンドを刺激しています。 3.確かに、あなたの管理チームがそれをサポートするつもりでない限り、あなたは持っているものと一緒に行かなければなりません:) – Stefan

0

他の誰かが、それはあなたのコードのいずれかのマイナーなエラーが潜在的に半分データベースがドロップされる可能性がありますので、生産上のdoctrine:schema:updateを使用することはお勧めできません答えのように。

かなり大きなプロジェクトで作業しており、doctrine:schema:update --dump-sqlを使用して、実行する必要のあるクエリを見つけて手動で実行します。

編集:追加の唯一の提案は、手動でクエリを実行したくない場合です。doctrine:schema:update --dump-sqlの出力を処理して、実行したくないクエリをフィルタ処理し、データベース上で残りのクエリを実行することができます。または、

2

myproject:schema:createIndexes(または何でも)のようなものを自分のスキーマを更新した後、あなたのインデックスを作成するコマンドを作成し、私は同じ名前で偽のインデックスを追加し、この使用して移行を解くことができました。

移行は、生のSQLを使用して、実際のフルテキストインデックスを追加しました:

$this->addSql('ALTER TABLE content ADD FULLTEXT fulltext_content(title, description)'); 

それから私は、エンティティ定義にインデックスを追加しました:限り、あなたが最初のフルテキストインデックスを生成するよう

@ORM\Table(name="content", indexes={@ORM\Index(name="fulltext_content",columns={"title","description"})}) 

、教義削除しなくなりました。

+1

これは実際にあまりにもずっと前に仕事を始めました(私は、 。これも今使っている。 – Stefan

関連する問題