【问题标题】:Whole word search with MySQL on MEDIUMTEXT在 MEDIUMTEXT 上使用 MySQL 进行全词搜索
【发布时间】:2023-03-11 11:23:02
【问题描述】:

我知道这个问题已经讨论过很多次了。 无论如何,我想再弄清楚。

嗯,我的表“文章”包含这些字段:

  • 标题(varchar 255)
  • 关键字(varchar 255)
  • content_body_1(中文本)
  • content_body_2(中文本)

有一个关于“标题”和“关键词”的索引。但是,MEDIUMTEXT 字段上没有索引。

我需要对所有这些字段执行“全词”搜索。我现在正在使用 REGEXP 执行此操作:

SELECT * FROM `articles` WHERE `content_body_1` REGEXP '[[:<:]]"keyword"[[:>:]]'

等等。 100 篇文章没问题,但 1000 篇文章非常慢(2-3 秒)。 REGEXP 在 MySQL 中不使用索引。如果我有 10000 篇文章怎么办?有什么方法可以更快地按整个关键字进行搜索?

我怎样才能得到它? FULLTEXT 更快吗?如果是 - 我该如何设计我的数据库?还有我应该如何处理 FULLTEXT 搜索的最小字符数限制?

谢谢。

【问题讨论】:

  • 全文搜索是执行这些操作的更好方法,而且速度更快。您可以在my.cnf 中限制ft_word_min_len 中的最小字符数

标签: php mysql regex full-text-search


【解决方案1】:

FULLTEXT 在应用时比 REGEXP 快很多。作为测试,我在 0.06 秒内从 173,979 行中找到了 4 行中的一个单词。

您需要执行ALTER TABLE tbl ADD FULLTEXT(content_body_1); 来为该列建立一个 FT 索引。

您可以将多个列组合成一个 FT 索引——如果您想在所有列中进行搜索。如果您还想搜索单个列,请添加单列 FT 索引。

研究细节; MyISAM 有一组警告; InnoDB 有不同的集合。

【讨论】:

    【解决方案2】:

    为什么要使用正则表达式进行全文搜索?您可以轻松地使用 % 字符,它可能比使用正则表达式要快得多。

    SELECT * FROM articles WHERE content_body_1 LIKE '%keyword%'

    这将找到您的 content_body_1 在其中某处包含关键字的任何行。

    【讨论】:

    • 我不需要查找所有还包含关键字的单词。全词搜索意味着如果您搜索“less”,则不应得到“无价”或“小于”之类的内容。所以 LIKE 在这里不起作用
    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多