MySQL - обычный индекс против полного текста - PullRequest
0 голосов
/ 26 июня 2019

На основе следующей упрощенной таблицы:

CREATE TABLE Lexicon (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    term VARCHAR(100),
    entry TEXT,
) ENGINE=InnoDB;

Как бы вы запросили в базе данных такие вещи, как термины, которых нет в их записях ? Или условия, которых нет ни в одной записи ?

Я думал об использовании FULLTEXT INDEX on Lexicon(entry), но AGAINST() часть запроса MATCH() не позволила бы мне передавать какие-либо привязки.

SELECT term FROM Lexicon 
WHERE NOT MATCH(entry) AGAINST('only-literals-allowed-here' IN BOOLEAN MODE);

Итак, можно ли каким-либо образом использовать полнотекстовые индексы в подобных сценариях, или простой индекс с обычным запросом сопоставления с образцом будет единственным способом?

Например (проверка по собственной записи):

SELECT term FROM Lexicon
WHERE entry NOT LIKE CONCAT ('%', term, '%');

или еще более чудовищный (проверьте по всем записям в таблице):

SELECT LexiconB.term FROM Lexicon as LexiconA
JOIN Lexicon as LexiconB ON LexiconA.entry NOT LIKE CONCAT('%', LexiconB.term, '%')
GROUP BY LexiconB.term
HAVING COUNT(*) = (SELECT count(*) FROM Lexicon);
...