Документация MySQL для MATCH...AGAINST
в логическом режиме говорит что-то вроде: «Звездочка служит оператором усечения (или подстановочного знака). В отличие от других операторов, она добавляется к слову, на которое нужно воздействовать. Слова совпадают, если они начинаются сслово, предшествующее оператору *. "Это означает, что вы можете использовать его только для соответствия начала слова.Я хочу, чтобы поиск был максимально эффективным, и иногда слова, которые я ищу, являются частичными словами в середине целевой строки.Я пытаюсь избежать полного сканирования таблицы, когда мне это не нужно.
Есть ли способ объединить синтаксис MATCH...AGAINST
с резервной копией WHERE foo LIKE '%bar%
?
Например, у меня есть следующая таблица (с кучей полей для краткости опущено):
CREATE TABLE `tours` (
`tourId` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`tourName` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`tourId`),
FULLTEXT KEY `ft_tourId_tourName` (`tourName`,`tourId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Я хочу иметь возможность искать как tourId, так и tourName в одном запросе, выполняя только полную таблицусканировать, когда мне абсолютно необходимо.
Возможно ли сделать что-то подобное, где я объединяю MATCH...AGAINST
и LIKE
, не делая полное сканирование таблицы:
SELECT
*
FROM
tap.tourdetails
WHERE
MATCH(tourId, tourName) AGAINST('dc10*' IN BOOLEAN MODE)
OR tourId LIKE '%dc10%' OR tourName LIKE '%dc10%' ORDER BY tourName;
В настоящее время вышеприведенное делает полное сканирование таблицы, даже если '* dc10 *' действительно совпадает с MATCH...AGAINST
.Я хочу использовать LIKE
(и требуется полное сканирование таблицы) только в случае сбоя MATCH.Возможный?Альтернативные решения?