Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm Doctrine2-使用全文和MyIsam_Doctrine Orm_Myisam_Full Text Search - Fatal编程技术网

Doctrine orm Doctrine2-使用全文和MyIsam

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中为全文搜索提供自己的支持

我正在Symfony2中构建一个应用程序,使用Doctrine2和mysql。我想使用全文搜索。我找不到太多关于如何实现这一点的信息——现在我被困在如何将表引擎设置为myisam上

似乎无法使用注释设置表类型。另外,如果我通过运行“ALTER TABLE”查询手动完成,我不确定Doctrine2是否会继续正常工作——它是否依赖于InnoDB外键


有更好的地方问这些问题吗?

Doctrine在转向Doctrine2时放弃了v1的全文搜索功能。您可能需要在Doctrine2中为全文搜索提供自己的支持

我正在考虑使用迁移来生成表本身,运行带有本机SQL查询选项的搜索查询来获取引用由条令管理的表的ID集,然后使用所述ID集正常地通过条令生成记录

很可能会定期更新全文表。

INTRODUCTION Doctrine2使用InnoDB,它支持在条令关联中使用外键。但由于MyISAM还不支持这一点,所以您不能使用MyISAM来管理条令实体

另一方面,目前正在开发的MySQL v5.6将支持InnoDB FTS,因此将支持InnoDB表中的全文搜索

解决 因此有两种解决方案:

  • 使用MySQL v5.6的风险由您自己承担,并修改一点原则来实现匹配方法:(如果需要,我可以翻译,但仍然存在bug,我不推荐这种解决方案)

  • 正如QuickShift所描述的,创建一个带有全文索引的MyISAM表只是为了对其执行搜索。As Doctrine2允许本机SQL请求,并且您可以将此请求映射到实体()

  • 第二个解决方案的示例 考虑下表:

    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;