full-text-search - MariaDB 上的 MATCH AGAINST SQL 查询未按预期工作

标签 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:用 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/

相关文章:

c# - 使用代码优先模型的 "Composable"全文搜索

hibernate - 如何将@添加到postgres hibernate方言?

c# - 使用C#向数据库中插入数据时出错

mysql - 如何将新对象添加到 MariaDB 中现有的 JSON 对象中?

c# - 关系数据库的全文搜索?

MySQL MATCH AGAINST - 处理单引号

php - 从正则表达式得到错误 'nothing to repeat at offset 1'

mariadb - 像跟踪 MongoDB 操作日志一样跟踪 MariaDB 数据库更改

mysql - 从 MySQL 迁移到 MariaDB - 外键约束形成不正确

php - 在 phpmyadmin 中执行 mysql 脚本时,如何区分本地开发数据库和实时生产数据库?