Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Эффективный поиск %подстроки% в строке 
V
    Опции темы
afiskon
Дата 27.6.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Помогите, пожалуйста, со следующей задачей.

Есть таблица, содержащая несколько миллионов строк, длина которых колеблется где-то в диапазоне от 1 до 70-и. Нужно быстро находить строки по %подстроке%. В качестве БД можно использовать MySQL или PostgreSQL.

В документации к MySQL сказано:
Цитата

If you use ... LIKE '%string%' and string is longer than three characters, MySQL uses the Turbo Boyer-Moore algorithm to initialize the pattern for the string and then uses this pattern to perform the search more quickly.


Похоже, это не оптимальный вариант, так что простой индекс не годится. Обнаружил, что в MySQL есть поддержка FULLTEXT индекса:

Цитата

You can also create FULLTEXT indexes. These are used for full-text searches. Only the MyISAM storage engine supports FULLTEXT indexes and only for CHAR, VARCHAR, and TEXT columns. Indexing always takes place over the entire column and column prefix indexing is not supported. 


И вроде они даже работают быстрее LIKE-запросов. Смущает только упоминание морфологии и стоп-слов. Это ведь можно отключить?

В PostgreSQL FULLTEXT индексов не нашел. Может, плохо искал?

Еще, как вариант, в обоих СУБД можно сделать таблицу, содержащую наши строки, сдвинутые (не цеклически) на 1, 2, 3 и тд символов влево с простым индексом. Такая штука должна быстро решать задачу, но смущает сложность реализации-поддержки. Хотелось бы использовать встроенные средства СУБД.

Что посоветуете?
PM MAIL WWW   Вверх
LSD
Дата 27.6.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(afiskon @  27.6.2011,  13:06 Найти цитируемый пост)
Это ведь можно отключить?

Нужно учитывать, что полнотекстовый поиск не полностью эквивалентен LIKE.


Цитата(afiskon @  27.6.2011,  13:06 Найти цитируемый пост)
В PostgreSQL FULLTEXT индексов не нашел. Может, плохо искал?

Chapter 12. Full Text Search


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
afiskon
Дата 27.6.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Спасибо за ссылку.

Цитата

Цитата(afiskon @  27.6.2011,  13:06 Найти цитируемый пост)
Это ведь можно отключить?

Нужно учитывать, что полнотекстовый поиск не полностью эквивалентен LIKE.


Да, почитал. Поиск по релевантности. Совсем не то.

Выходи, единственное решение - дополнительная таблица? Даже в PostgreSQL ничего на мой случай не предусмотрено?
PM MAIL WWW   Вверх
LSD
Дата 27.6.2011, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(afiskon @  27.6.2011,  14:39 Найти цитируемый пост)
Да, почитал. Поиск по релевантности. Совсем не то.

Там есть IN BOOLEAN MODE, который не учитывает релевантность, а только вхождение слова в индекс. Но я имел в виду, что полнотекстовый поиск ищет только по словам. Т.е. знаки препинание, пробелы и т.д. в индексе отсутствуют.

P.S. Как изменить список стоп-слов.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Akina
Дата 27.6.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(afiskon @  27.6.2011,  14:39 Найти цитируемый пост)
Да, почитал. Поиск по релевантности. Совсем не то.

Плохо читал. Читай ещё раз, но ВНИМАТЕЛЬНО.
Цитата(LSD @  27.6.2011,  14:31 Найти цитируемый пост)
полнотекстовый поиск не полностью эквивалентен LIKE

Зависит от режима и модификаторов. Можно сделать полностью эквивалентным.

Добавлено через 41 секунду
Цитата(LSD @  27.6.2011,  14:48 Найти цитируемый пост)
я имел в виду, что полнотекстовый поиск ищет только по словам. Т.е. знаки препинание, пробелы и т.д. в индексе отсутствуют.

ааа... это верно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
afiskon
Дата 27.6.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Для латиницы, цифр и тире (которое можно заменить на подчеркивание или другой знак) полнотекстовый поиск подойдет? Извините за глупые вопросы, но я действительно не знаток БД.
PM MAIL WWW   Вверх
Akina
Дата 27.6.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(afiskon @  27.6.2011,  13:06 Найти цитируемый пост)
Такая штука должна быстро решать задачу, но смущает сложность реализации-поддержки

Ну в принципе на базе триггеров несложно реализовать доп. таблицу таких "повёрнутых" строк... но её размер... и тормоза на операциях изменения данных...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
afiskon
Дата 27.6.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Данные, к счатью, не изменяются. Но добавляются новые.

Это сообщение отредактировал(а) afiskon - 27.6.2011, 13:57
PM MAIL WWW   Вверх
Akina
Дата 27.6.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



ааа... ну тогда действительно один раз создать индексированную таблицу версий подстрок и быстро искать по индексу. Ну будет у тебя в этой таблице сотня миллионов строк... хотя всё равно получится не сказать что очень быстро.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
afiskon
Дата 27.6.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Видимо, нужно тупо экспериментировать. Спасибо за помощь.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

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


 




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


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

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