![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Столкнулся с проблемой поиска в базе данных MySQL.
SELECT `id` FROM `db_name`.`words` WHERE `word` LIKE 'ПОИСКОВЫЙ_ЗАПРОС' меня совсем не устраивает. Пусть в базе данных хранятся тексты. Например «Привет медвед! Как твои дела?». Пользователь вводит в строку поиска слово «медвед», в базу данных отправляется запрос: SELECT `id` FROM `db_name`.`words` WHERE `word` LIKE '%медвед%' . База данных возвращает нам необходимое значение. А если человек введет слово «медвед» с ошибкой, например «мидвед» или «меддвед» или «мевед» или вообще введет «МеДвЕд», то в базе данных ничего найдено не будет. Решение я придумал такое. При помощи цикла составлять такие вот запросы:
Т.е. искать при помощи регулярных выражений, учитывая все возможные ошибки. Но такой метод, как мне кажется, будет очень долгим и ресурсоемким. Как бы вы организовали поиск по базе данных, с учетом возможных ошибок и очепяток пользователя? Это сообщение отредактировал(а) NLspieler - 8.3.2009, 18:16 |
|||
|
||||
| solenko |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 34 Всего: 67 |
NLspieler, а sounex для кирилицы еще не сделали?
-------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Я впервые слышу про sounex.
Что это такое? И как его использовать для текущей задачи? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
soundex
в цикле формировать маски - да, это отстой. тебе надо разложить задачу на составляющие. отдельно решить вопрос индексирования текста, то есть создание связи "текст" <-> "множество ключевых слов". отдельно решать вопрос поиска. т.е. вместо работы с исходным текстом, ты проводишь сравнение со связанными с ним ключевыми словами. и вот тут уже вариантов хватает: 1. прямое сравнение(с учетом регистра и без) 2. soundex - "поиск по звучанию" 3. поиск по словарю(чтоб проходило сравнение "быстро" == "мгновенно" или "CPU" == "процессор" ) 4. стемминг("радостный" == "радости") 5. собственный алгоритм. а че, для кирилицы разве есть реализация soundex в mysql? или идем по пути "кирилица" -> "translit" -> "soundex"? |
|||
|
||||
| solenko |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 34 Всего: 67 |
так и я вопросительный знак поставил. Как-то мне с кирилицей не приходится в последнее время работать -- решил оставить гугл на совести топикстартера. В как-то слабо верится. А что, работает? -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
да, но коряво, само собой.
soundex "может работать некорректно с кодировкой utf8" и "для слов из символов не английского язіка может возвращать неадекватные значения". есть "попытки создания soundex для русского языка"(как указано в википедии), но насколько удачные - не знаю. впрочем, редкий хостинг позволит установить библиотеку с MySQL UDF. |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Посмотрел страницу о sounex в википедии.
Нашел там ссылку на неплохой sounex для кириллицы, на php. Очевидно, что это то, что мне нужно! Например, слова 'аренсфелде' и 'ариентсвелде' пропущенные через эту функцию выдают одинаковый результат А652. А строка 'ориенсфэлдэ' выдает О652. По-моему, это просто гениально!!! Значит в MySQL таблицу нужно добавить дополнительное поле индекс, в котором хранить sounex - индексы, слов соответствующего текста и производить поиск уже по ним. Это сообщение отредактировал(а) NLspieler - 9.3.2009, 11:41 |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
soundex!
|
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
Искать надо то, что пользователь сказал искать.
Пользователь не обрадуется. если при вводе "медвед" ему выдадут варианты с "медведь". И лишь отдельно надо ПРЕДЛОЖИТЬ поискать по исправленному варианту. |
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Ну вот. Теперь я опять запутался.
Значит для поиска по «неисправленному тексту» нужно дополнительное поле индекс, в котором хранить текст без лишних символов, в одном регистре (все буквы либо маленькие, либо все буквы большие). Или же можно производить поиск по базе, не зависимо от регистра букв? Т.е. как сделать, что бы запрос «привет» выдавал результаты «ПрИвеТ», «Привет», «ПРивет» или «привет» ? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
||||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
Кодировка предположительно будет такой cp1251_bin
|
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
|
|||
|
||||
| NLspieler |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 619 Регистрация: 13.10.2008 Где: Берлин Репутация: 16 Всего: 19 |
||||
|
||||
| Djinn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 18.5.2007 Репутация: 1 Всего: 1 |
Ну по кодировкам стоит лезть в инет и отдельно читать... если cp1251 - лучше всего cp1251_general_ci - регистронезависимая, а еще лучше юзать UTF8 по определению... мало ли какие случае будут у Вас на сайте... вдруг придется какие-то языки экзотические постить ?
насчет вопроса по поиску-самого интересует... пока не нашел идеального решения... |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |