Поиск по шаблону по столбцу (столбцам) в большой таблице (> 10.000.000 строк) в MySQL - PullRequest
2 голосов
/ 17 декабря 2008

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 17 декабря 2008

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

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

В Википедии есть хороший список различных движков индексации - здесь .

2 голосов
/ 17 декабря 2008

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

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

Я слышал кое-что хорошее о Поиск сфинкса , но я еще не использовал его.

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

1 голос
/ 18 декабря 2008

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

0 голосов
/ 17 декабря 2008

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

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

0 голосов
/ 17 декабря 2008

отметьте « полнотекстовый поиск » в MySQL docs (AFAIK, все существующие СУБД поддерживают это)

0 голосов
/ 17 декабря 2008

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

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

...