2013-03-19 4 views
5

Что было бы хорошим способом поиска в поле, игнорируя пробелы в поисковом терминах И поле?MySQL - поиск поля, игнорирующего пробелы

Пример:

SELECT * 
FROM tablename 
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%' 

Реальный пример:

Мой клиент имеет веб-сайт продажи длинных блоков двигателей. Тем не менее, они часто заставляют людей искать на своем сайте «cat 3306 longblock» (вместо «cat 3306 long block»). Нам нужны механизмы с длинными блоками, которые будут отображаться при поиске «длинного блока».

Примечание: это, вероятно, не имеет значения для этого вопроса, но этот сайт построен с использованием PHP 5.3 и phpActiverecord.

ответ

2

Вы также можете рассмотреть Sphinx или Lucene для полного текста, например, поиска по полнотекстовому полю mysql. Я не использовал их лично, но я слышал, что оба они превосходят mysql в полнотекстовых индексах.

Следует отметить, что все эти методы требуют специального обновления для обновления, что добавляет дополнительные расходы на обслуживание и сервер.

Хорошая статья на сфинксе: http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

бесплатного решения для технического обслуживания, что делает хорошо для названия продукта или номеров просто расколоть пользователь условие поиска пробелов и добавить LIKE «термина%%» для каждого к вашему запросу ,

Кроме того, я создаю специальное поле поиска, которое является именем или номером продукта, с его жетонами в алфавитном порядке и пробелами и символами. Вы должны обновлять это поле каждый раз, когда имя продукта изменяется. Затем в дополнение к запросам к исходному полю I OR поиск против этого нового разделенного поля. Пример, если у вас есть имя продукта, например «cat 3306 longblock», затем создайте поле product_name_search и поместите «3306catlongblock». Когда пользователь ищет 3306 long-block Вы обрабатываете поиск по вскрышным символам и расщеплению на пространствах:

WHERE (other product name search clauses) OR 
    (product_name_search LIKE '%3306%' AND product_name_search LIKE '%longblock%') 

Этот процесс не так хорошо, как FREETEXT но он делает достаточно хорошо для названия продуктов и номеров.

+0

Спасибо, Тим. Специальное поле поиска может работать.Самая большая проблема заключается в том, что мы ищем «3306 longblock», когда продукт называется «Cat 3306 Long Block». Обратите внимание на недостаток места в поисковом запросе. –

+1

вам нужно разбить поиск '3306 longblock' на ... LIKE '% 3306%' AND ... LIKE '% longblock%' против обработанного поля product_name_search –

+0

Это сработало, спасибо Tim. –

3

Я бы предположил, что существует ряд подходов, в зависимости от того, насколько просто вы хотите это сделать. Я лично хотел бы использовать полнотекстовый поиск, используя принципы, изложенные здесь http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

Но вы могли бы также лишить пространства из термина поиска с использованием регулярных выражений т.е.

$str=preg_replace('/\s+/', '', $str); 
+0

Спасибо за ответ. Пробелы не находятся в поиске. Они в той области, которую мы ищем. Мы ищем «длинный блок», и поле содержит «длинный блок». –

+0

в этом случае полнотекстовый поиск поможет вам .... – diagonalbatman

+0

Gotcha. Вы проверите это ... спасибо! –

0

Существует способ, использующий функцию repace. Пример:

SELECT * FROM `products` where REPLACE(PartName, ' ', '') = REPLACE('0 1 3000 70 27', ' ', '') 
Смежные вопросы