【问题标题】:Full text search with InnoDB tables使用 InnoDB 表进行全文搜索
【发布时间】:2010-09-22 20:45:46
【问题描述】:

我需要使用全文搜索,但我在 Web 应用程序中使用的表使用 INNODB 引擎,从我读到的 JDBC 不支持 Mysql 触发器,我应该在课程服务器上部署项目因此无法安装 sphinxs 等工具,有人可以建议一种执行全文搜索的方法吗?

谢谢

编辑:项目中的要求是有一个一致的数据库,我要执行搜索的表包含我正在为其构建 Web 应用程序的实验室中存在的仪器列表,可以插入新的工具,但是让我们假设插入访问很少,并且大多数表将用于读取访问,在这种情况下,使用 MyIsam 是合理的并且它是否符合一致性要求(Myisam 不支持事务) ?

【问题讨论】:

    标签: mysql jdbc full-text-search innodb


    【解决方案1】:

    您可以使用 MyISAM 创建第二个表,其中仅包含主表的主键和您希望 FULLTEXT 搜索的文本内容。然后,当您想要进行全文搜索时,您可以在正确的 InnoDB 表和搜索诱饵 MyISAM 表之间执行JOIN,并针对 MyISAM 表使用MATCH 条件。

    这还允许您将 MyISAM 表中的不同搜索诱饵文本存储到 InnoDB 表中的“真实”文本中,这允许您实现 MySQL 的 FULLTEXT 引擎可以实现的诸如词干或特殊撇号/连字符处理等功能t 管理。

    这里的问题当然是保持 MyISAM 数据与 InnoDB 数据一致。您可以每隔一段时间运行一项作业,或者在有文本更新时让应用程序写入两个表。无论哪种方式,希望您可以摆脱全文搜索中的不一致问题,这对于“规范”表数据来说是不可接受的。

    另一种方法是在您想要的全文解决方案不可用时退回到LIKE/RLIKE (regexp) 匹配。将无法索引,所以不会很快,但至少它会一直工作,而且对于较小的数据库来说没问题。

    编辑:

    我要在其上执行搜索的表包含我正在为其构建 Web 应用程序的实验室中存在的仪器列表

    好的,这真的必须是FULLTEXT 可搜索的吗?将这样的列表建模为每种类型的设备一个实体,以及实验室和设备(或其他任何设备)之间的连接表不是更好吗?

    如果同时发生 2 次插入?

    MyISAM 不会让两个INSERTs 声明相同的主键。但这不足以保证一般情况下的“一致性”。虽然从实际的角度来看,这听起来你可以侥幸逃脱,但如果对“一致性”有明确的要求,那可能正是他们不希望你做的事情。

    【讨论】:

    • 是的,他们建议我们使用 FULLTEXT 搜索,因为每个乐器也有一个描述字段,这就是我们需要执行搜索的地方。
    • 我想我会遵循这个建议“您可以使用 MyISAM 创建第二个表,其中仅包含主表的主键和您希望 FULLTEXT 搜索的文本内容。然后当您想要进行全文搜索,您在正确的 InnoDB 表和搜索诱饵 MyISAM 表之间进行 JOIN,并针对 MyISAM 表使用 MATCH 条件。"
    • 我认为如果我返回了实验室中不存在的仪器的类型,这没什么大不了的,因为这是我们应该在搜索词中返回的。
    • 一共有多少种乐器? RLIKE 和由此产生的全表扫描可能不是世界末日,除非你有很多储备充足的实验室!
    • 这不是真正的实验室,只是为了描述项目应用。
    猜你喜欢
    • 2010-11-25
    • 2012-12-29
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多