2015-11-05 4 views
1

У меня есть таблица, которая содержит около миллиона записей транспортных средств. Я хочу, чтобы реализовать функцию поиска, так что пользователь может сделать поиск на транспортном средстве, к сожалению, столбец FULLTEXT содержит данные, такие как ...MySql FULLTEXT поиск символов между словами

«Мотор автомобиля Fortuner-GJ00XX1234 Тойота»
«Мотор автомобиля Fortuner-GJ00XX04567-Toyota»
и т.д .....

Это означает, что конкретная запись для «двигатель автомобиля» модель «Fortuner» с регистрационным номером «GJ00XX1234» и название компании «Тойота».

Пользователи, пытающиеся найти «fortuner 1234» ИЛИ «1234», как правило, пользователь не помнит полный регистрационный номер. В результате MySql возвращает все записи с помощью «fortuner», но не может выполнить поиск «1234». Однако работает поиск «GJ00XX1234».

Я знаю, что использование запроса «LIKE»% 1234% »работает, но есть проблема с производительностью, поэтому я должен достичь этого, используя только FULLTEXT.

Может ли кто-нибудь вести меня, как достичь этого, не изменяя данные? Спасибо.

+2

Я уважаю голосование, но следует упомянуть, почему он голосует за вопрос. –

ответ

0

Разделить строку поиска пробелами и добавить в запрос следующим

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) 

Вот manual

Примечание

При реализации этой функции MySQL использует то, что иногда называют , как подразумевается булевой логики, в которой

  • обозначает И

  • обозначает НЕ

[ни один оператор] не означает, ИЛИ

+0

Я знаю, что использование LIKE может быть достигнуто, но у меня очень большой объем данных, поэтому я должен использовать только индекс FULLTEXT. –

+0

создайте столбец, содержащий возможные ключевые слова из FULLTEXT. Поиск от него – Thamilan

+0

Создание избыточности путем создания нового столбца и размещения ключевых слов (только для целей поиска) - это не очень хорошая идея. –

1

Вы не можете достичь этого, используя полнотекстовый поиск без разделения/добавления к индексу. Существует boolean full-text search mode, который позволяет добавить джокер *, но afaik это not possible to prepend the joker из-за того, как индексы работают в MySQL.

Для обеспечения эффективности использования полнотекстового поиска, вероятно, лучшей идеей было бы включить второй столбец, содержащий числа в полнотекстовом индексе, или установить новый столбец только для поиска, содержащий что-то вроде motor car fortuner gj00xx1234 toyota 1234.

Если вы предпочитаете % например. LIKE %1234% или REGEXP, это поразит вашу производительность, потому что индексы не могут быть использованы, что приведет к полному сканированию таблицы. В зависимости от размера данных, насколько интенсивным.

Смежные вопросы