Как выполнить поиск, убирая пробел в самой таблице?

Статус
В этой теме нельзя размещать новые ответы.

Old_Angel

Новичок
Как выполнить поиск, убирая пробел в самой таблице?

Задача такая:

В таблице хранятся например такие данные: 345 G 15

Если я ищю ту же строку (345 G 15), то все ок, но моя задача такая, что я должен ввести в поиск тоже самое, но без пробелов.

Например если я введу 345G15, то чтобы запрос находил 345 G 15.

Проблема в том, что во входящих данных я могу отфильтровать что хочешь, а в искомых не получается.
Поможет кто?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Если ты будешь
выполнить поиск, убирая пробел в самой таблице
то запрос будет медленный

Храни данные в дополнительном поле без пробелов.
 

Old_Angel

Новичок
Автор оригинала: Mr_Max
Если ты будешь

то запрос будет медленный

Храни данные в дополнительном поле без пробелов.
Спасибо, я думал об этом, но так не годится по двум причинам, во первых и самое главное, в этом случае я не смогу подсвечивать найденный текст, а второе, дублирование записей, это значит, что база будет почти в два раза больше от ее исходной, что затруднит делать бэкап в будущем, когда она подрастет.

Ну, а что касается медленного запроса, то в данном случае это не страшно, пишу для себя на своем серваке. Главное, можно ли такую задачу реализовать и как...
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Да какая разница где и на каком серванте ты пишешь.
Писать нужно сразу ПО-ЧЕЛОВЕЧЕСКИ, а не так, как тебе удобно.
 

Old_Angel

Новичок
Тем не менее, можно ли так сделать, как спрашиваю, в самом запросе, чтобы не выводить эти данные в переменную и уже на лету ее не парсить?

Либо вариант подсветки найденного в оригинальной (первой) таблице.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
что затруднит делать бэкап в будущем, когда она подрастет.
Скажи, пожалуйста, как именно затруднит? Дамп будет больше в 2 раза?... При терабайтных то винтах?
Хорошо. Допустим. Что-то мешает очистить это поле перед дампом?

в этом случае я не смогу подсвечивать найденный текст
Это еще почему?
 

Old_Angel

Новичок
Автор оригинала: Mr_Max
Скажи, пожалуйста, как именно затруднит? Дамп будет больше в 2 раза?... При терабайтных то винтах?
Хорошо. Допустим. Что-то мешает очистить это поле перед дампом?


Это еще почему?
А смысл его очищать, если потом снова надо будет проводить тогда ее индекс..
Меня интересует первый вариант или второй, но с подсветкой текста в оригинале...
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Old_Angel
в самом запросе
Можно, но если ты неправильная пчела, которая дает неправильный мед - то за ответом тебе прямая дорога - в другой форум. В данном форуме подобных ответов не дают.

вариант подсветки найденного в оригинальной (первой) таблице.
Мысли есть?

-~{}~ 10.10.08 01:47:

3/14здец.
Ты давай определяйся.
то тебя
что затруднит делать бэкап в будущем, когда она подрастет
то
А смысл его очищать, если потом снова надо будет проводить тогда ее индекс
-~{}~ 10.10.08 01:48:

очищать чтоб делать дамп
и только потому, что процесс делания дампа
тебя
затруднит делать бэкап в будущем, когда она подрастет
 

Old_Angel

Новичок
По поводу подсветки данного варианта мыслей нет, потому что как минимум надо тогда еще один столбец создавать со своеобразным индексом, который будет указывать, на какой строке и через сколько знаков будет пробел. Наоборот очень легко, а обратно вот.. Других идей пока нет.

-~{}~ 10.10.08 02:55:

Потому что будет подсвечиваться именно найденный текст, который на самом деле будет его синонимом.

Мы нашли например 345G15, а в оригинале это 345 G 15, т.е. с двумя пробелами. Откуда мы будем знать, на каком месте и сколько стоят пробелы?
А ведь каждый лишний знак, и пробел тоже, будет уже не совпадением. А значит я могу фильтровать только вхождение, но не результат.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
с двумя пробелами
Да хоть с двадцатью двумя.

Читаешь внимательно. Желательно утром на свежую голову
1. Исходный текст в бд - "345 G 15";
2. Заводишь в БД "поле без пробелов"
3. Юзер вводит как ему угодно. Он ведь может не знать как правильно пишутся марки, или что там у тебя.
например
a) 345 G 15
б) 345G 15
в) 345 G-15
Еще оч.много вариантов.

Ты нормализируешь то, что он ввел к виду "без пробелов"
Ищешь в БД так-же по полю "без пробелов" п.2
__При выводе__ содержимого поля п.1 "подсвечиваешь" то что нужно юзеру.
www.php.net/regexp

-~{}~ 10.10.08 02:10:

.

Есть еще вариант перечисления в запросе всех возможных вариантов
Типо
3 45G15
34 5G15
345 G15
345G 15
345G1 5
3 4 5G15
3 45 G15
3 45G 15
3 45G1 5
3 4 5 G15
3 4 5G 15
3 4 5G1 5
3 4 5 G15
3 4 5 G 15
3 4 5 G 1 5

:D :D :D :D :D
 

Old_Angel

Новичок
Попробую поиграться с регулярными выражениями, но пока сомневаюсь в подсветке такого типа простыми методами )). Ну а что касается вариантов перебора, то здесь пробовал варианты с заменой %, но вылезают в итоге все совпадения, которые не совсем нужны..
 

MiksIr

miksir@home:~$
На самом деле, что поиск по полю с пробелами, что поиск по полю без пробелов... однохренственно, ибо раз нужна подстветка, то строка эта может быть где угодно, так что индексы тут никак не помогут, а экономия будет разве что в "поиск строки vs регэксп"... что может быть и не ощутимо.
Так что пусть ищет регекспом без всякиъ этих доп полей. А для быстроты нужны свою индексацию делать.
 

Old_Angel

Новичок
Автор оригинала: MiksIr
На самом деле, что поиск по полю с пробелами, что поиск по полю без пробелов... однохренственно, ибо раз нужна подстветка, то строка эта может быть где угодно, так что индексы тут никак не помогут, а экономия будет разве что в "поиск строки vs регэксп"... что может быть и не ощутимо.
Так что пусть ищет регекспом без всякиъ этих доп полей. А для быстроты нужны свою индексацию делать.
Согласен, но я не могу принять решения из-за того, что не могу выполнить этот поиск и сравнение из-за нестандартной задачи, как бы ровно наоборот получается..
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
MiksIr
Как думаешь? Что быстрее будет работать?
1) поиск без индекса + навешенная регулярка на каждое поле по миллиону записей
2) просто поиск без индекса по нормализированому полю по миллиону записей?
Бейнчмарки сделаешь?
 

Old_Angel

Новичок
Если это тест, то второе. Но смысл ухода от темы?

-~{}~ 10.10.08 03:25:

Мне сейчас нужны не тесты производительности, а результат, который я уже потом доведу до ума..
 

MiksIr

miksir@home:~$
Как я думаю? Я думаю, что это зависит от структуры и типа данных. Например в случае огромного количества тяжелых данных с возможностью поиска по ним раз в сутки предлагать дублировать все это еще я бы не стал даже в бреду. Впрочем, если данных не очень много, а скорость важна, то это тоже не решение - нужно разбираться со структурой данных и строить свои индексы. Где-то в промежуточном варианте это может и хорошо будет... только опять же, подумал сначала (с бенчмарками по конкретным наборам данных), а не попробовать ли просто LOCATE('mystring', REPLACE(field, ' ', '')).
 

Old_Angel

Новичок
Автор оригинала: MiksIr
а не попробовать ли просто LOCATE('mystring', REPLACE(field, ' ', '')).
Хмм.. В принципе работает, вот только теперь если ищем 345 G 15, как есть, то он его уже не находит, т.к. в принципе, мы пробелы то удалили )), зато то, что надо было изначально, по сути ищет ))

-~{}~ 10.10.08 04:12:

Ну а если мы сделаем ИЛИ, то будет порядок!

-~{}~ 10.10.08 11:15:

Автор оригинала: MiksIr
LOCATE('mystring', REPLACE(field, ' ', '')).
Все супер! Спасибо огромное!!! И работает быстро!

P.S. И без лишней демагогии и разведения кадила, если бы так многие пользователи общались, было бы куда полезнее, чем флудить по три тысячи сообщений, и все бестолку.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Old_Angel
Все супер! Спасибо огромное!!! И работает быстро!
Ну ну...
Вот когда у тебя сервак ляжет - заходи.

MiksIr
То, что ты сделал зовется медвежьей услугой.
Код:
mysql> select BENCHMARK(10000000, (LOCATE('G45F', REPLACE('foobar G 45 F barfoo',
 ' ', ''))));
+-------------------------------------------------------------------------------
+
| BENCHMARK(10000000, LOCATE('G45F', REPLACE('foobar G 45 F barfoo', ' ', '')))
|
+-------------------------------------------------------------------------------
+
|                                                                             0
|
+-------------------------------------------------------------------------------
+
1 row in set (4.80 sec)
м......?

Old_Angel
P.S. И без лишней демагогии и разведения кадила, если бы так многие пользователи общались, было бы куда полезнее, чем флудить по три тысячи сообщений, и все бестолку.
Давай-ка ты сперва почитаешь вот здесь
http://phpclub.ru/faq/WhyForum

Есть на форуме ламеры, а есть новички.
Пока ты ламер, и, вероятнее всего им останешься.
К сожалению.
Мне жаль своего потраченного времени.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху