Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > MySQL > Искать данные с начала слов |
Автор: DissDoc 22.10.2010, 07:35 | ||||
Всем привет. Итак проблема, есть набор слов в БД (один столбец)
Нужно сравнивать запрос только с начала слов Если делаю так
То мне выдастся все! А нужно сравнивать от начала слов. Тогда мне по запросу like '%Ив%' получу список Иванов Иван Васильев Иван Как такое реализовать? |
Автор: Akina 22.10.2010, 07:56 |
Это - диалектозависимо. Указывайте СУБД и просите перенести тему в соотв. раздел. |
Автор: A5uKa 22.10.2010, 07:57 | ||
? |
Автор: Akina 22.10.2010, 07:58 | ||
Возможный более-менее независимый вариант:
Да и тот - зависит от маско-символов диалекта. |
Автор: Zloxa 22.10.2010, 08:46 |
"Васильев Иван" не отберется. |
Автор: Akina 22.10.2010, 09:03 | ||
Тогда уж
|
Автор: Frees 22.10.2010, 09:24 | ||
Это я и имел ввиду... вариант
мне больше понравился (я не видел этот пост когда писал свой) |
Автор: Zloxa 22.10.2010, 09:29 |
все равно full scan |
Автор: DissDoc 22.10.2010, 10:10 |
У меня MySQL. Это может сильно влиять? |
Автор: Frees 22.10.2010, 10:17 |
может в сторону полнотекстового поиска посмотреть... |
Автор: skyboy 22.10.2010, 10:23 |
конечно, может. потому что в mysql есть встроенные http://habrahabr.ru/blogs/webdev/40218/. но там есть конструктивное ограничение - работает только для myisam таблиц. а у них уже не работают транзакции. т.е. если «хочется» и транзакции иметь, и шустрый полнотекстовый поиск, то fulltext index уже «не то». в таком случае будет лучше использовать http://sphinxsearch.com. правда, это потребует запуска отдельной программы, что не на каждом хостинге будет возможно. |
Автор: skyboy 22.10.2010, 10:23 | ||
|
Автор: Zloxa 22.10.2010, 10:31 |
быть может ему не надо индексирования, а достаточно rlike '[^|/W]Ив' |
Автор: DissDoc 22.10.2010, 12:56 |
А rlike выполняется в запросе в MySQL? |
Автор: Zloxa 22.10.2010, 13:06 |
http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp |
Автор: DissDoc 23.10.2010, 10:05 | ||
Zloxa, ваш запрос не совсем верно работает. Я вот все никак не мог успокоиться и в результате нашел правильное решение для себя. Мне кажется оно более простое
можно даже чуть ограничить в моем контекста и сравнивать по регистру через BINARY ![]() |
Автор: tishaishii 23.10.2010, 21:40 |
regexp там точно есть, только зачем? Для задачи достаточно match..against in boolean mode, а regexp индексы не пользует (если и можно, то с пробелмами), like пользует только если поиск с начала строки. Можно поставить триггер к таблице, который бы вёл другую таблицу со списками слов по нужным полям. Тогда, при поиске, можно использовать простые индексы и свои навороты. |
Автор: Zloxa 24.10.2010, 09:46 |
приведенные лайки тоже не используют, но регексп предпочтительнее, если у нас разделителем может являться не только пробел: "Абу-т-Тайиб Абу-Салим аль-Мутанабби",'Мамин-Сибиряк'. А возможность использования fulltext я не оспариваю. Однако, как уже было замечено, fultext нельзя исползьзовать на InnoDb, да и на мылых объемах обоснованость его применения - условна. ТС не спрашивает как ускорить like, он спрашивает как его реализовать. Значит, полагаю, производительность like его устраивает. |