MySQL 以任何或特定顺序搜索单词(多种可能性)- 最佳方法?

MySQL search for words in any or specific order (multiple possibilities) - Best approach?

我有一个 MySQL 数据库,其中包含一列和许多已填充的行 与句子。我想进行一个需要用户输入的搜索 (可以是 space 分隔的 1 个或多个单词)来查找句子 其中包含特定顺序的单词,如下所示:

用户输入: Word1 Word2

搜索选项:

  1. 以任意顺序查找包含这 2 个词的句子 地点
  2. 找到第一个包含Word1的句子,然后 Word2 在任何地方,但不只是在 Word1 之后(至少 1 个字 之间)
  3. 找到第一个包含Word1的句子,然后 Word2紧随其后。
  4. 在任何地方(不是第一个)找到包含 Word1 的句子,并且 Word2 在任何地方,但不只是在 Word1 之后(至少 1 个字 之间)
  5. 在任何地方(不是第一个)找到包含 Word1 的句子,并且 Word2紧随其后。

此外,使用此规则可以搜索超过 2 个词 结合起来找到特定的模式。

在一个网站上,当用户使用时,我看到了类似搜索的解决方案 搜索字段中的特殊标志以查找他们想要的模式。例如: X + Y(一个词紧接着另一个词),X - Y(一个词 其次是其他的,立即或一些单词 between), X Y (任意顺序的单词)...

有什么解决这个问题的建议吗?我读了很多关于 Regex 的文章 或全文搜索,但我不知道从哪里开始,什么是 最佳解决方案。什么是最好的和快速的搜索这种 有问题吗?

提前致谢!

  • 在列上有一个 FULLTEXT 索引。
  • 构造MATCH(col) AGAINST('+word1 +word2' IN BOOLEAN MODE)作为初级过滤器。
  • 构造 AND col RLIKE ... 或其他东西 - 当您有更多约束时。

逻辑如下:

  • MATCHWHERE 子句的一部分时,它将是 运行 第一个,因为它非常有效。
  • + in AGAINST 表示必填词。
  • 这将筛选出几行,即包含所有这些词的行。
  • 然后其他子句(对 运行 来说会很昂贵)不会太昂贵,因为它们只会命中几行。

    1. (任何地方的单词)不需要额外的条款。
    2. (有序,但不相邻):col RLIKE '[[:<:]]word1[[:>:]].*[[:alpha:]].*[[:<:]]word2[[:>:]]'
    3. (开始,相邻,按一定顺序:col RLIKE '^word1[[:>:]] [[:<:]]word2[[:>:]]'(假设单词之间有单个space)
    4. (不明确;排序不明确)——是其他两种情况的组合。
    5. (相邻,按一定顺序:col RLIKE '[[:<:]]word1 word2[[:>:]]'(假设单词之间有一个space)

正则表达式注释:

  • [[:<:]]表示单词的开头
  • ^(第一个)表示字符串的开始
  • .*[[:alpha:]].* 匹配任何至少有一个字母的字符串