我正在一个正在使用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: Took 0 seconds to read lines for log 'Log Agent'
如果我按以下方式进行查询(LogLine是具有全文搜索的列):
SELECT * FROM log_agent.temp_logs WHERE MATCH(LogLine) AGAINST ('+Log' IN BOOLEAN MODE);
但是,即使列值包含Log
,以上查询也不返回结果。如果我尝试将+Log
更改为+seconds
,那么它将返回该行,那么为什么要找到seconds
但找不到Log
,如果我将+Log
更改为{ {1}}行被返回,因此它们似乎并没有韵律或原因。
我曾尝试删除+Agent
,因为我以前不需要这个,但没有区别。
答案 0 :(得分:1)
使用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测试,该测试只会发现几行。然后,将在这些行上花费更多的精力。