MySQL搜索任意或特定顺序的单词(多种可能性)-最佳方法?
我有一个MySQL数据库,其中有一列和许多行,这些行是填充的 用句子。我想做一个搜索,将采取用户输入 (可以是一个或多个用空格分隔的单词)来查找句子 其中包含按如下特定顺序排列的单词: 用户输入:MySQL搜索任意或特定顺序的单词(多种可能性)-最佳方法?,mysql,regex,database,search,full-text-search,Mysql,Regex,Database,Search,Full Text Search,我有一个MySQL数据库,其中有一列和许多行,这些行是填充的 用句子。我想做一个搜索,将采取用户输入 (可以是一个或多个用空格分隔的单词)来查找句子 其中包含按如下特定顺序排列的单词: 用户输入:Word1Word2 搜索选项: 找到包含这两个单词的句子,顺序任意 放置 首先查找包含Word1的句子,然后 Word2在任何地方,但不仅仅是在Word1之后 之间) 首先查找包含Word1的句子,然后 紧跟在它后面的Word2 在任何位置(不是第一个)查找包含Word1的句子,然后 Word2在任何
Word1
Word2
搜索选项:
Word1
的句子,然后
Word2
在任何地方,但不仅仅是在Word1
之后
之间)Word1
的句子,然后
紧跟在它后面的Word2
Word1
的句子,然后
Word2
在任何地方,但不仅仅是在Word1
之后(至少一个单词在
之间)Word1
的句子,并
紧跟在它后面的Word2
X+Y
(一个词紧接着另一个词),X-Y
(一个词
紧接着是另一个,立即或者用一些单词
介于之间),xy
(任意字序)
如何解决这个问题有什么建议吗?我读了很多关于Regex的书
或者全文搜索,但我不知道从哪里开始,什么是
最佳解决方案。什么是最好的和快速的搜索这种类型的
有问题吗
提前谢谢你 - 在列上有一个
索引全文
- 根据(“+word1+word2”在布尔模式下)构造
作为主过滤器匹配(col)
- 当你有更多的约束条件时,构造
或其他东西和colrlike…
- 当
是MATCH
子句的一部分时,它将首先运行,因为它非常有效WHERE
中的+
相对,表示所需的单词与
- 这将过滤到几行,即包含所有这些单词的行
- 那么其他的条款(运行起来会很昂贵)也不会太昂贵,因为它们只涉及几行
- (任何地方的文字)不需要额外的条款
- (有序但不相邻):
col-RLIKE'[[[::]].[[:alpha:].[[::]].[[::]]'
- (开始,相邻,按特定顺序:
(假定单词之间有一个空格)列,如“^word1[[:>:][[::]]”
- (不明确;顺序不明确)——是其他两种情况的组合
- (相邻,按一定顺序:
(假定单词之间有一个空格)列类似于“[[::]]”
[[:不是一个完整的答案,但我认为您正在寻找搜索DSL(搜索领域特定语言).ElasticSearch可能是一个很好的开始。使用RegExp将您的
或Word+Word
转换为ElasticSearch表达式将相对简单。可能有ElasticSearch的替代方法,甚至可以提供这样简单的搜索输入规则。谢谢您的回答。我查看了一些关于Elasticsearc的文本h但从MySQL过渡到ES对我来说有点复杂。我刚开始学习MySQL和PHP,并开始掌握它。有没有可能给我一些建议,如何用MySQL和PHP解决这个问题?那将非常感谢。老实说,你最好使用像elasticsearch这样的现成解决方案来解决r减少复杂性。虽然您可能已经被MySQL和PHP淹没,但最好不要构建和维护自己的搜索库。可能有一个PHP搜索库,您可以找到,我不知道PHP在大约15年的时间里发生了什么,所以我帮不上忙。您完全可以尝试创建你们每个人R5搜索规则,PHP语言。但您首先需要准确定义您希望用户输入的内容作为每个规则的搜索词。正如ocodo所说,专用引擎是您的最佳选择。您可以使用全文搜索,但必须自己实现它不支持的内容。使用全文搜索(您不需要它,但它可能会更快),然后检查您的其余条件是否满足(例如,Word-Word
和列like=“%word1%word2%”用于4)。这需要干净的数据,例如,您的单词正好由一个空格分隔,而不是
或其他什么,否则测试会变得更复杂)。您可能还需要定义如果单词出现两次会发生什么情况(例如,单词1出现在开头和中间)。更一般的一句话:您确定您需要这样的专门搜索选项吗?在2018年,如果用户必须以如此精确的方式选择他想要搜索的内容,这将带来非常奇怪(=不常见)的用户体验(看看siri/google是如何使用的)。你可能想根据自己的条件来排序结果(例如,如果句子以单词1开头,那么权重要比句子末尾的权重高)。尽管如此,elasticsearch/solr/…还是有更好的设备。如果您的用户不是最终用户,这可能是另一种情况。感谢您提供这些解决方案。它们将非常有用。您现在有没有机会将用户输入转换为5。从您的列表中选择解决方案,使用PHP到MySQL-代码为理解+符号作为一个单词与另一个单词相邻的规则吗?我做了一些更改。至于将,
解释为PHP的输入——这是PHP中的一个解析问题;我只解决MySQL问题。请参阅+
preg\u match('/