У меня есть таблица, которая содержит около миллиона записей автомобилей. Я хочу реализовать функцию поиска, чтобы пользователь мог выполнять поиск по транспортному средству, к сожалению, столбец FULLTEXT содержит такие данные, как …
«Моторный Автомобиль Fortuner-GJ00XX1234-Toyota»
«Автомобили Fortuner-GJ00XX04567-Toyota»
так далее…..
Это означает, что конкретная запись относится к модели «автомобиль» «fortuner» с регистрационным номером «GJ00XX1234» и названием компании «toyota».
Пользователи, которые пытаются найти «fortuner 1234» ИЛИ «1234», как правило, не запоминают полный регистрационный номер. В результате MySql возвращает все записи с «fortuner», но не может искать «1234». Однако поиск «GJ00XX1234» работает.
Я знаю, что запрос «LIKE ‘% 1234%'» работает, но есть проблема с производительностью, поэтому мне нужно добиться этого, используя только FULLTEXT.
Кто-нибудь может подсказать мне, как этого добиться без изменения данных?
Благодарю.
Вы не можете достичь этого, используя поиск FULLTEXT без разделения / добавления в индекс. Eсть логический режим полнотекстового поиска что позволяет добавить джокер *
но афаик это невозможно предварять джокер из-за способа работы индексов в MySQL.
Для сохранения преимуществ производительности полнотекстового поиска, вероятно, лучше всего было бы включить второй столбец, содержащий цифры в полнотекстовом индексе, или установить новый столбец только для поиска, который содержит что-то вроде motor car fortuner gj00xx1234 toyota 1234
,
Если вы готовы %
например. LIKE %1234%
или же REGEXP
это снизит вашу производительность, потому что индексы не могут быть использованы, что приведет к полному сканированию таблиц. Зависит от объема данных, насколько интенсивным.
Разбить строку поиска по пробелам и добавить в запрос, как это
WHERE data LIKE '%fortuner%' OR data LIKE '%1234%'
или более простые термины
WHERE data REGEXP 'fortuner|1234'
в последнем случае ваш код PHP может быть:
$searchString = "fortuner 1234";
$search = str_replace(' ','|','fortuner 1234');
ОБНОВИТЬ:
Для FULLTEXT:
WHERE
MATCH (data)
AGAINST ('+fortuner +1234' IN BOOLEAN MODE)
Здесь руководство
Заметка
При реализации этой функции MySQL использует то, что иногда называют
как подразумевается булева логика, в которой[без оператора] подразумевает ИЛИ
обозначает И
обозначает НЕ