php – Symfony2 / Doctrine2:不要在模式下删除全文索引:updat
发布时间:2020-12-13 13:41:24 所属栏目:PHP教程 来源:网络整理
导读:为了支持Symfony2中的全文索引,我使用了MyISAM镜像表.我们经常将我们的生产数据集复制到该表中,并创建了一个可以映射表的结构并与实体相关联的SearchEntity.因此,我们可以在我们的SearchRepository(使用自定义MATCH AGAINST语句构建器)上执行搜索查询,并通过
为了支持Symfony2中的全文索引,我使用了MyISAM镜像表.我们经常将我们的生产数据集复制到该表中,并创建了一个可以映射表的结构并与实体相关联的SearchEntity.因此,我们可以在我们的SearchRepository(使用自定义MATCH AGAINST语句构建器)上执行搜索查询,并通过解析关联来检索找到的实体.
现在,当我执行doctrine:schema:update Doctrine2不能识别该表上的(手动添加)索引,并且想要删除它们.不幸的是,没有任何建议注释说“但是让这个索引保持原样!”. 我已经尝试使用与全文索引(前缀为ft_)相同字段的@Index注释来欺骗Doctrine,然后手动执行某些SQL以将其替换为FT索引,但是失败:当Doctrine最初创建表时这些虚拟索引失败,因为索引关键字长度大于1000字节(这是MySQL的明显原因的硬限制) 问题是:我可以建议Doctrine在模式:update命令上完全保留在表上找到的索引吗?有没有办法把它嵌入框架?在每个模式更新后重新创建全文索引是非常繁琐的:( SearchEntity: /** * @ORMTable(name="tmp_search2",options={"engine"="MyISAM"},* uniqueConstraints={@ORMUniqueConstraint(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"}) * } * ) * @ORMEntity(repositoryClass="SearchRepository") */ class SearchEntity { /** * This field is only here to satisfy doctrine's need for a non-composite primary key. * @ORMId * @ORMColumn(name="id",type="integer") * @ORMGeneratedValue(strategy="AUTO") */ private $searchId; /** * @ORMManyToOne(targetEntity="ProductOffer") * @ORMJoinColumn(name="product_offer_id",referencedColumnName="id") */ private $productOffer; /** * @var integer * * @ORMColumn(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);
我可以使用迁移解决这个问题,然后添加相同名称的伪索引.
迁移使用原始SQL添加实际的全文索引: $this->addSql('ALTER TABLE content ADD FULLTEXT fulltext_content(title,description)'); 然后我将索引添加到实体定义: @ORMTable(name="content",indexes={@ORMIndex(name="fulltext_content",columns={"title","description"})}) 只要您首先生成全文索引,Doctrine将不再删除它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |