Войти

Показать полную графическую версию : Сложный поиск в бд


Abell2000
26-09-2006, 10:48
Народ, появилась проблема,
есть две таблицы и нужно сравнить несколько полей на предмет совпадений, задача нетривиальная, но вот в чем проблема:
скажем есть поле model и в нем данные : 280XL, 280 XL, 280-XL, XL 280,
а в другой таблице для model: 280xL, так вот, если посмотреть, то в первой таблице записаны одни и теже данные только по разному, с пробелом, без, с тире, задом наперед, возможно ли произвести поиск, чтоб вернуть все результаты?

P.S. используется MySQL и PHP

Prisoner
26-09-2006, 11:58
В PHP есть множество строковых функций которые возвращают схожесть по таким признакам как звучание. Аналог такой функции в MySql - SOUNDEX(str)
SOUNDEX(str)
Возвращает саундекс от str. Soundex - ``идентификатор звучания строки''. Словосочетания ``К скалам бурым'' и ``С каламбуроми'' должны давать одинаковый саундекс, т.к. на слух они звучат одинаково. Заметим, однако, что этой функции для русского языка не существует. MySQL нуждается в ней, и если кто-то может предоставить алгоритм саундекса на русском языке - свяжитесь с нами. - Прим. переводчика. Две созвучные строки, создающие впечатление почти одинаковых, могут иметь идентичные саундексы. Обычно стандартная саундекс-строка имеет длину 4 символа, но функция SOUNDEX() возвращает строку произвольной длины. Можно использовать функцию SUBSTRING() для извлечения стандартного саундекса строки из результата функции SOUNDEX(). В строке str игнорируются все символы, не являющиеся буквами или цифрами. Все международные буквенные символы, не входящие в диапазон A-Z, трактуются как гласные:
mysql> SELECT SOUNDEX('Hello');
-> 'H400'

mysql> SELECT SOUNDEX('Quadratically');
-> 'Q36324'


Кстати, если Вам необходима функция и для русских слов, то не стоит сразу отметать это способ, справьтесь, возможно, что поддержку русского языка уже добавили.

ivank
26-09-2006, 16:45
Логичней пройтись по всем записям в базе и нормализовать (привести к общему виду) их, используя некую эвристику. Саундэкс xl-280 и 280-xl _всегда_ буде разным. То бишь перестановки влияют на саундэкс очень сильно, поэтому это не очень хороший метод, как мне кажется.

mar
26-09-2006, 18:47
мне как-то (на postgresql) приходилось делать нечто подобное. Но там большой выбор строковых функций и регекспов. На мой вкус ivank совершенно прав - проще все привести в порядок один раз + сделать программный фильтр-поправлялку на ввод данных на будущее.

hasherfrog
26-09-2006, 19:08
Я всё же перенесу тему, хоть и не совсем это "вебмастеру" а, скорее, "web-программирование".

Prisoner
27-09-2006, 11:03
На правах оправдания :). Конечно, порядок - хорошо вельми. Я ориентировался на "сравнить". Это понятие, имхо, не включает наведение порядка, относящееся скорее к организации процесса сравнения.

mar
27-09-2006, 12:39
Prisoner
так порядок наводить-то как? как раз предложенным тобой способом :)




© OSzone.net 2001-2012