:スキーマにフルテキストインデックスを削除しないでください。私たちは、定期的にそのテーブルに当社の生産データセットをコピーして、テーブルの構造をマッピングし、実際のエンティティに関連付けられている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);
これは直接的な解決策ではありませんが、内部的に 'doctrine:schema:update'を実行し、独自のSQLを実行して追加のインデックスを作成する独自のコンソールコマンドを作成することができます – JamesHalsall
だからdoctrine:schema :自分自身をもう一度更新しますか?いいえ、私はそれがフレームワークに属すると思うし、そこには良い(誰もがそれがうまくいくとは分かっています。 Doctrineの側には実際にそれを修正するためのいくつかの作業があると思います。 Doctrineの型を(好ましくはバンドルを使って)拡張するための方法があるかもしれません。 – Stefan
Doctrine 2.5には "フラグ"オプションがあります。 "fullltext"に設定すると、ftインデックスを自動的に作成することができます:http://stackoverflow.com/questions/23448266/add-a-fulltext-index-in-doctrine-2-using-annotations – Stefan