为了支持Symfony2中的全文索引,我使用了MyISAM镜像表.我们经常将我们的生产数据集复制到该表中,并创建了一个可以映射表的结构并与实体相关联的SearchEntity.因此,我们可以在我们的SearchRepository(使用自定义MATCH AGAINST语句构建器)上执行搜索查询,并通过解析关联来检索找到的实体.
现在,当我执行doctrine:schema:update Doctrine2不能识别该表上的(手动添加)索引,并且想要删除它们.不幸的是,没有任何建议注释说“但是让这个索引保持原样!”.
我已经尝试使用与全文索引(前缀为ft_)相同字段的@Index注释来欺骗Doctrine,然后手动执行某些sql以将其替换为FT索引,但是失败:当Doctrine最初创建表时这些虚拟索引失败,因为索引关键字长度大于1000字节(这是MySQL的明显原因的硬限制)
问题是:我可以建议Doctrine在模式:update命令上完全保留在表上找到的索引吗?有没有办法把它嵌入框架?在每个模式更新后重新创建全文索引是非常繁琐的:(
SearchEntity:
/** * @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创建tmp_search索引(首先删除什么教义离开那里,然后创建我们的)
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);