Doctrine orm Doctrine2-使用全文和MyIsam
我正在Symfony2中构建一个应用程序,使用Doctrine2和mysql。我想使用全文搜索。我找不到太多关于如何实现这一点的信息——现在我被困在如何将表引擎设置为myisam上 似乎无法使用注释设置表类型。另外,如果我通过运行“ALTER TABLE”查询手动完成,我不确定Doctrine2是否会继续正常工作——它是否依赖于InnoDB外键Doctrine orm Doctrine2-使用全文和MyIsam,doctrine-orm,myisam,full-text-search,Doctrine Orm,Myisam,Full Text Search,我正在Symfony2中构建一个应用程序,使用Doctrine2和mysql。我想使用全文搜索。我找不到太多关于如何实现这一点的信息——现在我被困在如何将表引擎设置为myisam上 似乎无法使用注释设置表类型。另外,如果我通过运行“ALTER TABLE”查询手动完成,我不确定Doctrine2是否会继续正常工作——它是否依赖于InnoDB外键 有更好的地方问这些问题吗?Doctrine在转向Doctrine2时放弃了v1的全文搜索功能。您可能需要在Doctrine2中为全文搜索提供自己的支持
有更好的地方问这些问题吗?Doctrine在转向Doctrine2时放弃了v1的全文搜索功能。您可能需要在Doctrine2中为全文搜索提供自己的支持 我正在考虑使用迁移来生成表本身,运行带有本机SQL查询选项的搜索查询来获取引用由条令管理的表的ID集,然后使用所述ID集正常地通过条令生成记录 很可能会定期更新全文表。INTRODUCTION Doctrine2使用InnoDB,它支持在条令关联中使用外键。但由于MyISAM还不支持这一点,所以您不能使用MyISAM来管理条令实体 另一方面,目前正在开发的MySQL v5.6将支持InnoDB FTS,因此将支持InnoDB表中的全文搜索 解决 因此有两种解决方案:
table 'user' : InnoDB [id, name, email]
table 'search_user : MyISAM [user_id, name -> FULLTEXT]
然后,您只需编写一个带有连接和映射的搜索请求(在存储库中):
这样,您的搜索用户表将始终获得最后的更改
当然,这只是一个例子,我想保持简单,我知道这个查询可以用LIKE完成。看起来不错。实际上,我最终还是坚持使用Innodb并实现了Sphinx,它运行得非常好:
<?php
public function searchUser($string) {
// 1. Mapping
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Acme\DefaultBundle\Entity\User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'name', 'name');
$rsm->addFieldResult('u', 'email', 'email');
// 2. Native SQL
$sql = 'SELECT u.id, u.name FROM search_user AS s JOIN user AS u ON s.user_id = u.id WHERE MATCH(s.name) AGAINST($string IN BOOLEAN MODE)> 0;
// 3. Run the query
$query = $this->_em->createNativeQuery($sql, $rsm);
// 4. Get the results as Entities !
$results = $query->getResult();
return $results;
}
?>
CREATE TRIGGER trigger_insert_search_user
AFTER INSERT ON user
FOR EACH ROW
INSERT INTO search_user SET user_id=NEW.id, name=NEW.name;
CREATE TRIGGER trigger_update_search_user
AFTER UPDATE ON user
FOR EACH ROW
UPDATE search_user SET name=name WHERE user_id=OLD.id;
CREATE TRIGGER trigger_delete_search_user
AFTER DELETE ON user
FOR EACH ROW
DELETE FROM search_user WHERE user_id=OLD.id;