2016-06-06 2 views
2

Я имею эту компанию таблицу:MySQL - SQL запросов с опечатками

TABLE company 
+----+----------------+--------+--------+ 
| id | name   | rating | enable | 
+----+----------------+--------+--------+ 
| 1 | Spirit company | 3.5 | 1  | 
| 2 | Test   | 2  | 1  | 
| 3 | Hello world | 4  | 1  | 
+----+----------------+--------+--------+ 

Когда пользователь сделать исследование, этот запрос сделан (Exemple с поиском = дух компании):

SELECT `company`.*, 
    1+IF(`name` REGEXP 'sp[iíìîï]r[iíìîï]t[ -][cç][oóòôöõø]mp[aáàâäåã][nñ][yýÿ]',10, 
     IF(`company`.`name` REGEXP '(sp[iíìîï]r[iíìîï]t)|([cç][oóòôöõø]mp[aáàâäåã][nñ][yýÿ])',5,0) 
    ) as `ratio` 
FROM `company` 
WHERE `company`.`enable`=1 
ORDER BY`ratio` DESC, `company`.`rating` DESC 

Это работает отлично! Теперь, если пользователь делает опечатку, можно дать средний результат?

Пример: поиск пользователей 'spitit company', я хочу добавить +3 к коэффициенту, потому что только одна буква отличается.

+2

Таким образом, вам в основном нужна метрика, которая дает вам расстояние между двумя входами. Это то, что делает алгоритм расстояния Levensthein - этот пост дает вам функцию mysql для него: http://stackoverflow.com/questions/13909885/how-to-add-levenshtein-function-in-mysql –

ответ

1

Это блестящий @ невротических-й

Так вот новый запрос:

SELECT `company`.*, 
    1+IF(`name` REGEXP 'sp[iíìîï]r[iíìîï]t[ -][cç][oóòôöõø]mp[aáàâäåã][nñ][yýÿ]',10, 
     IF(levenshtein(`company`.`name`, 'spirit company')<3,8, 
     IF(`company`.`name` REGEXP '(sp[iíìîï]r[iíìîï]t)|([cç][oóòôöõø]mp[aáàâäåã][nñ][yýÿ])',5, 
     IF(levenshtein(`company`.`name`, 'spirit')<LENGTH(`company`.`name`)-LENGTH('spirit')+1,3, 
     IF(levenshtein(`company`.`name`, 'company')<LENGTH(`company`.`name`)-LENGTH('company')+1,3, 
     0))))) as `ratio` 
FROM `company` 
WHERE `company`.`enable`=1 
ORDER BY`ratio` DESC, `company`.`rating` DESC 

Большое спасибо!

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