МАТЧ ПРОТИВ SQL Query на MariaDB не работает должным образом - PullRequest
1 голос
/ 20 июня 2019

Я работаю над проектом, в котором я использую 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 для +Agent, строки возвращаются, так что их неткажется какой-то рифмой или причиной того, что он делает.

Я пытался удалить IN BOOLEAN MODE, так как раньше мне это не нужно, но без разницы.

1 Ответ

1 голос
/ 21 июня 2019

При использовании MyISAM FULLTEXT:

: *1002*
  • есть 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, который найдет только несколько строк.Тогда это пойдет на дополнительные усилия в этих рядах.

...