在MariaDB上针对SQL进行匹配查询无法按预期工作

时间:2019-06-20 17:32:13

标签: full-text-search mariadb

我正在一个正在使用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,因为我以前不需要这个,但没有区别。

1 个答案:

答案 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测试,该测试只会发现几行。然后,将在这些行上花费更多的精力。