我正在做一个项目,我正在使用 MySQL MATCH AGAINST。我以前在另一个项目中使用过没有任何问题并使用相同的基本代码,除了我有一些奇怪的行为。唯一真正的区别是我使用的是 MariaDB 而不是 MySQL。
下面是我的表是如何定义的
CREATE TABLE `temp_logs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`LogID` int(11) NOT NULL,
`LogReceived` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Host` int(11) NOT NULL,
`LogName` varchar(100) NOT NULL,
`LogLine` text NOT NULL,
PRIMARY KEY (`id`),
KEY `IDXLogID` (`LogID`,`LogReceived`,`Host`),
FULLTEXT KEY `IDXLogLine` (`LogLine`)
) ENGINE=MyISAM AUTO_INCREMENT=5838772 DEFAULT CHARSET=latin1;
我正在执行全文搜索的列之一包含以下内容:
19/06/2019 19:01:18:用 0 秒读取日志“Log Agent”的行
如果我这样查询(LogLine是全文搜索的列):
SELECT * FROM log_agent.temp_logs WHERE MATCH(LogLine) AGAINST ('+Log' IN BOOLEAN MODE);
但上面的查询没有返回任何结果,即使如上所示列值包含 Log
。如果我尝试将 +Log
更改为 +seconds
,它会返回该行,那么为什么它会找到 seconds
而不是 Log
,如果我再次为 +Agent
更改 +Log
行,那么它们似乎没有任何韵律或原因。
我已经尝试删除 IN BOOLEAN MODE
,因为我以前不需要它,但没有任何区别。
最佳答案
使用 MyISAM 的 FULLTEXT
有 3 个注意事项:
出现在超过一半行中的词不会被编入索引。
短于
ft_min_word_len
的词不会被编入索引。“停用词”列表中的词未编入索引。
过滤 FULLTEXT
倾向于忽略的内容时,这个技巧很有用:
WHERE MATCH(`LogLine`) AGAINST ('...' IN BOOLEAN MODE) -- things that FT can do
AND `LogLine` LIKE "..." -- (or NOT LIKE or RLIKE or NOT RLIKE, as needed)
这将相当有效,因为它会首先进行 FT 测试,这只会找到几行。然后它将在这些行上付出额外的努力。
关于full-text-search - MariaDB 上的 MATCH AGAINST SQL 查询未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691198/