Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Продвинутый поиск в mysql 
V
    Опции темы
NLspieler
Дата 8.3.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 '%медвед%' .
База данных возвращает нам необходимое значение.

А если человек введет слово «медвед» с ошибкой, например «мидвед» или «меддвед» или «мевед» или вообще введет «МеДвЕд», то в базе данных ничего найдено не будет. 

Решение я придумал такое. При помощи цикла составлять такие вот запросы: 

Код

SELECT `id` FROM `db_name`.`words` WHERE `word` LIKE '%медвед%' 
                                                                        OR `word` LIKE '%_едвед%'
                                                                        OR `word` LIKE '%м_двед%'
                                                                        ………
                                                                        OR `word` LIKE '%м_едвед%'
                                                                        ………


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

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

 




Это сообщение отредактировал(а) NLspieler - 8.3.2009, 18:16
PM MAIL   Вверх
solenko
Дата 8.3.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



NLspieler, а sounex для кирилицы еще не сделали?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
NLspieler
Дата 8.3.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Я впервые слышу про sounex.
Что это такое? И как его использовать для текущей задачи?
PM MAIL   Вверх
skyboy
Дата 8.3.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



soundex
Цитата(NLspieler @  8.3.2009,  17:15 Найти цитируемый пост)
Но такой метод, как мне кажется, будет очень долгим и ресурсоемким. 

в цикле формировать маски - да, это отстой.
тебе надо разложить задачу на составляющие.
отдельно решить вопрос индексирования текста, то есть создание связи "текст" <-> "множество ключевых слов". 
отдельно решать вопрос поиска. т.е. вместо работы с исходным текстом, ты проводишь сравнение со связанными с ним ключевыми словами.
и вот тут уже вариантов хватает:
1. прямое сравнение(с учетом регистра и без)
2. soundex - "поиск по звучанию"
3. поиск по словарю(чтоб проходило сравнение "быстро" == "мгновенно" или "CPU" == "процессор" )
4. стемминг("радостный" == "радости")
5. собственный алгоритм.
Цитата(solenko @  8.3.2009,  17:24 Найти цитируемый пост)
а sounex для кирилицы еще не сделали? 

а че, для кирилицы разве есть реализация soundex в mysql? или идем по пути "кирилица" -> "translit" -> "soundex"?
PM MAIL   Вверх
solenko
Дата 8.3.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(skyboy @  8.3.2009,  19:23 Найти цитируемый пост)
а че, для кирилицы разве есть реализация soundex в mysql? или идем по пути "кирилица" -> "translit" -> "soundex"?

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

В 
Цитата(skyboy @  8.3.2009,  19:23 Найти цитируемый пост)
"кирилица" -> "translit" -> "soundex"

как-то слабо верится. А что, работает?



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 8.3.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



да, но коряво, само собой.
soundex "может работать некорректно с кодировкой utf8" и "для слов из символов не английского язіка может возвращать неадекватные значения".
есть "попытки создания soundex для русского языка"(как указано в википедии), но насколько удачные - не знаю. впрочем, редкий хостинг позволит установить библиотеку с MySQL UDF.
PM MAIL   Вверх
NLspieler
Дата 9.3.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Посмотрел страницу о sounex в википедии.
Нашел там ссылку на неплохой sounex для кириллицы, на php.

Очевидно, что это то, что мне нужно!
Например, слова 
'аренсфелде' и 'ариентсвелде' пропущенные через эту функцию выдают одинаковый результат А652.
А строка 'ориенсфэлдэ' выдает О652.
По-моему, это просто гениально!!!


Значит в MySQL таблицу нужно добавить дополнительное поле индекс, в котором хранить sounex - индексы, 
слов соответствующего текста
 и производить поиск уже по ним.  


Это сообщение отредактировал(а) NLspieler - 9.3.2009, 11:41
PM MAIL   Вверх
skyboy
Дата 9.3.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



soundex!
PM MAIL   Вверх
nerezus
Дата 9.3.2009, 11:57 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



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

И лишь отдельно надо ПРЕДЛОЖИТЬ поискать по исправленному варианту.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
NLspieler
Дата 9.3.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Ну вот. Теперь я опять запутался. 

Значит для поиска по «неисправленному тексту» нужно дополнительное поле индекс, в котором хранить текст без лишних символов, в одном регистре (все буквы либо маленькие, либо все буквы большие).
Или же можно производить поиск по базе, не зависимо от регистра букв?
Т.е. как сделать, что бы запрос «привет» выдавал результаты «ПрИвеТ», «Привет», «ПРивет» или «привет» ?   
 

PM MAIL   Вверх
skyboy
Дата 9.3.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(NLspieler @  9.3.2009,  11:20 Найти цитируемый пост)
можно производить поиск по базе, не зависимо от регистра букв?

в зависимости от заданного collation. если там utf8_general_cs - то поиск будет регистрозависимым, если utf_general_ci - регистронезависимым.

PM MAIL   Вверх
NLspieler
Дата 9.3.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Кодировка предположительно будет такой cp1251_bin
PM MAIL   Вверх
nerezus
Дата 9.3.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

Кодировка предположительно будет такой cp1251_bin
 Зачем? о_О


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
NLspieler
Дата 9.3.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 619
Регистрация: 13.10.2008
Где: Берлин

Репутация: 16
Всего: 19



Цитата(nerezus @  9.3.2009,  12:26 Найти цитируемый пост)
 Зачем? о_О

А почему бы и нет?

Вообще, я до сих пор парюсь с кодировками. 
Когда я увидел список кодировок в MySQL, голова пошла кругом. 
Методом простого перебора, нашел первую попавшуюся, с которой все нормально работало, и это оказалась cp1251_bin

PM MAIL   Вверх
Djinn
Дата 9.3.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 18.5.2007

Репутация: 1
Всего: 1



Ну по кодировкам стоит лезть в инет и отдельно читать... если cp1251 - лучше всего cp1251_general_ci - регистронезависимая, а еще лучше юзать UTF8 по определению... мало ли какие случае будут у Вас на сайте... вдруг придется какие-то языки экзотические постить ?

насчет вопроса по поиску-самого интересует... пока не нашел идеального решения...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.