Поиск подстановочных знаков в столбцах в большой таблице (>10 000 000 строк) в MySQL

Какие методы вы бы использовали для реализации поиска содержимого в столбце очень большой таблицы в MySql? Скажем, например, что у вас есть 10 000 000 электронных писем, хранящихся в таблице в базе данных, и вы хотели бы реализовать поиск по теме, который позволил бы мне искать одно или несколько слов, присутствующих в теме электронной почты. Если пользователь искал «рождественский санта», вы должны найти электронные письма с такими темами, как «Санта посещает нас на это рождество» и «Рождество, Санта когда-нибудь покажет».

Моя идея состоит в том, чтобы обработать все слова в предметах (удалить все числа, специальные знаки, запятые и т. д.) и сохранить каждое слово в индексной таблице, где у меня есть уникальный индекс в столбце слов. Затем я бы связал это с таблицей электронной почты с помощью таблицы отношений «многие ко многим».

Есть ли лучший способ выполнения поиска по шаблону в очень больших таблицах?

Существуют ли базы данных, изначально поддерживающие такой поиск?


person sindre j    schedule 16.12.2008    source источник


Ответы (6)


Вы можете использовать индексы FULLTEXT, если используете MyISAM в качестве механизма хранения. Однако MySQL в целом не очень хорош с текстовым поиском.

Гораздо лучшим вариантом было бы использовать специальное решение для индексации текста, такое как Lucene или Сфинкс. Лично я бы порекомендовал Sphinx - он отлично интегрируется с PHP и MySQL и очень, очень быстр (может использоваться для ускорения даже обычных запросов - выполняет очень быструю группировку и упорядочение).

В Википедии есть хороший список различных механизмов индексирования — здесь.

person Eran Galperin    schedule 16.12.2008

Таблицы MySQL MyISAM поддерживают индекс FULLTEXT, который помогает в таком поиске.

Но это не самая быстрая технология, доступная для такого рода поиска. И вы не можете использовать его для данных, хранящихся в таблицах InnoDB.

Я слышал много хороших отзывов о Sphinx Search, но еще не пользовался им.

Вот еще один блог о Sphinx: http://capttofu.livejournal.com/13037.html

person Bill Karwin    schedule 16.12.2008

Хотя полнотекстовый индекс mysql возможен, я подозреваю, что рассмотрю возможность использования чего-то, предназначенного для поисковой системы, например Люсен.

person Zoredache    schedule 18.12.2008

Это похоже на полнотекстовый поиск, который поддерживает SQL Server.

Но ваша идея в целом здравая. Вы эффективно вычисляете «индекс» в своей таблице заранее, чтобы ускорить поиск.

person Craig Shearer    schedule 16.12.2008

Вы хотите посмотреть на функцию MATCH...AGAINST.

См., например: Использование полнотекстового поиска MySQL

person Eli    schedule 16.12.2008
comment
как обрабатывать правило 50%, используя ПОИСКПОЗ ----ПРОТИВ - person Manmeet Khurana; 14.05.2018

проверьте "полнотекстовый поиск" в документации MySQL ( Насколько я знаю, все текущие СУБД поддерживают это)

person Javier    schedule 16.12.2008