MySQL 以任何或特定顺序搜索单词(多种可能性)- 最佳方法?
MySQL search for words in any or specific order (multiple possibilities) - Best approach?
我有一个 MySQL 数据库,其中包含一列和许多已填充的行
与句子。我想进行一个需要用户输入的搜索
(可以是 space 分隔的 1 个或多个单词)来查找句子
其中包含特定顺序的单词,如下所示:
用户输入: Word1
Word2
搜索选项:
- 以任意顺序查找包含这 2 个词的句子
地点
- 找到第一个包含
Word1
的句子,然后
Word2
在任何地方,但不只是在 Word1
之后(至少 1 个字
之间)
- 找到第一个包含
Word1
的句子,然后
Word2
紧随其后。
- 在任何地方(不是第一个)找到包含
Word1
的句子,并且
Word2
在任何地方,但不只是在 Word1
之后(至少 1 个字
之间)
- 在任何地方(不是第一个)找到包含
Word1
的句子,并且
Word2
紧随其后。
此外,使用此规则可以搜索超过 2 个词
结合起来找到特定的模式。
在一个网站上,当用户使用时,我看到了类似搜索的解决方案
搜索字段中的特殊标志以查找他们想要的模式。例如:
X + Y
(一个词紧接着另一个词),X - Y
(一个词
其次是其他的,立即或一些单词
between), X Y
(任意顺序的单词)...
有什么解决这个问题的建议吗?我读了很多关于 Regex 的文章
或全文搜索,但我不知道从哪里开始,什么是
最佳解决方案。什么是最好的和快速的搜索这种
有问题吗?
提前致谢!
- 在列上有一个
FULLTEXT
索引。
- 构造
MATCH(col) AGAINST('+word1 +word2' IN BOOLEAN MODE)
作为初级过滤器。
- 构造
AND col RLIKE ...
或其他东西 - 当您有更多约束时。
逻辑如下:
- 当
MATCH
是 WHERE
子句的一部分时,它将是 运行 第一个,因为它非常有效。
+
in AGAINST
表示必填词。
- 这将筛选出几行,即包含所有这些词的行。
然后其他子句(对 运行 来说会很昂贵)不会太昂贵,因为它们只会命中几行。
- (任何地方的单词)不需要额外的条款。
- (有序,但不相邻):
col RLIKE '[[:<:]]word1[[:>:]].*[[:alpha:]].*[[:<:]]word2[[:>:]]'
- (开始,相邻,按一定顺序:
col RLIKE '^word1[[:>:]] [[:<:]]word2[[:>:]]'
(假设单词之间有单个space)
- (不明确;排序不明确)——是其他两种情况的组合。
- (相邻,按一定顺序:
col RLIKE '[[:<:]]word1 word2[[:>:]]'
(假设单词之间有一个space)
正则表达式注释:
[[:<:]]
表示单词的开头
^
(第一个)表示字符串的开始
.*[[:alpha:]].*
匹配任何至少有一个字母的字符串
我有一个 MySQL 数据库,其中包含一列和许多已填充的行 与句子。我想进行一个需要用户输入的搜索 (可以是 space 分隔的 1 个或多个单词)来查找句子 其中包含特定顺序的单词,如下所示:
用户输入: Word1
Word2
搜索选项:
- 以任意顺序查找包含这 2 个词的句子 地点
- 找到第一个包含
Word1
的句子,然后Word2
在任何地方,但不只是在Word1
之后(至少 1 个字 之间) - 找到第一个包含
Word1
的句子,然后Word2
紧随其后。 - 在任何地方(不是第一个)找到包含
Word1
的句子,并且Word2
在任何地方,但不只是在Word1
之后(至少 1 个字 之间) - 在任何地方(不是第一个)找到包含
Word1
的句子,并且Word2
紧随其后。
此外,使用此规则可以搜索超过 2 个词 结合起来找到特定的模式。
在一个网站上,当用户使用时,我看到了类似搜索的解决方案
搜索字段中的特殊标志以查找他们想要的模式。例如:
X + Y
(一个词紧接着另一个词),X - Y
(一个词
其次是其他的,立即或一些单词
between), X Y
(任意顺序的单词)...
有什么解决这个问题的建议吗?我读了很多关于 Regex 的文章 或全文搜索,但我不知道从哪里开始,什么是 最佳解决方案。什么是最好的和快速的搜索这种 有问题吗?
提前致谢!
- 在列上有一个
FULLTEXT
索引。 - 构造
MATCH(col) AGAINST('+word1 +word2' IN BOOLEAN MODE)
作为初级过滤器。 - 构造
AND col RLIKE ...
或其他东西 - 当您有更多约束时。
逻辑如下:
- 当
MATCH
是WHERE
子句的一部分时,它将是 运行 第一个,因为它非常有效。 +
inAGAINST
表示必填词。- 这将筛选出几行,即包含所有这些词的行。
然后其他子句(对 运行 来说会很昂贵)不会太昂贵,因为它们只会命中几行。
- (任何地方的单词)不需要额外的条款。
- (有序,但不相邻):
col RLIKE '[[:<:]]word1[[:>:]].*[[:alpha:]].*[[:<:]]word2[[:>:]]'
- (开始,相邻,按一定顺序:
col RLIKE '^word1[[:>:]] [[:<:]]word2[[:>:]]'
(假设单词之间有单个space) - (不明确;排序不明确)——是其他两种情况的组合。
- (相邻,按一定顺序:
col RLIKE '[[:<:]]word1 word2[[:>:]]'
(假设单词之间有一个space)
正则表达式注释:
[[:<:]]
表示单词的开头^
(第一个)表示字符串的开始.*[[:alpha:]].*
匹配任何至少有一个字母的字符串