Частичное совпадение слов в MySQL, сочетающее MATCH ... ПРОТИВ и LIKE в качестве резервной копии - PullRequest
0 голосов
/ 12 октября 2018

Документация 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.Возможный?Альтернативные решения?

1 Ответ

0 голосов
/ 13 октября 2018

Допустим, вы ожидаете найти xyzdc10:

  • MATCH не подаст xyzdc10, но LIKEs найдет.
  • LIKE с подстановочным знаком впереди требует полного сканирования таблицы.
  • Вы используете OR.

Отсюда и таблицаscan.

Вместо этого, если вам нужны только слова , начинающиеся с dc10, то избавьтесь от LIKEs - MATCH выполняет всю работу и делает это быстро.

FULLTEXT индексация разбивает столбец (столбцы) на слова и ищет слова.LIKE нет;вместо этого он должен сканировать каждую строку.Без индекса LIKE с начальным подстановочным знаком.

...