Полнотекстовый поиск с InnoDB

Я разрабатываю высокообъемное веб-приложение, где частью его является база данных MySQL дискуссионных сообщений, которая должна будет плавно расти до 20M+ строк.

первоначально я планировал использовать MyISAM для таблиц (для встроенного возможности полнотекстового поиска), но думал о всю таблицу будучи заблокированным из-за одной операции записи, я закрываю затвор. Блокировки на уровне строк имеют гораздо больше смысла (не говоря уже о другой скорости InnoDB преимущества при работе с огромными таблицами). Поэтому, по этой причине, я решил использовать InnoDB.

проблема... InnoDB не имеет встроенных возможностей полнотекстового поиска.

должен ли я использовать стороннюю поисковую систему? Как Lucene (c++) / Сфинкс? У кого-нибудь из вас, ниндзя базы данных, есть предложения/рекомендации? в LinkedIn zoie в этой игре (на основе Lucene) выглядит как лучший вариант на данный момент... будучи построен вокруг возможностей реального времени (что довольно важно для моего приложения.) Я немного сомневаюсь, чтобы совершить еще без некоторого понимания...

(FYI: будет на EC2 с высокой памятью, используя PHP для обслуживания интерфейса)

8 ответов


Я могу поручиться за то, что MyISAM fulltext-плохой вариант - даже оставляя в стороне различные проблемы с таблицами MyISAM в целом, я видел, что полнотекстовый материал сошел с рельсов и начал развращать себя и регулярно сбой MySQL.

выделенная поисковая система, безусловно, будет самым гибким вариантом здесь - хранить данные post в MySQL/innodb, а затем экспортировать текст в поисковую систему. Вы можете легко настроить периодическую сборку/публикацию полного индекса и добавить обновления индекса в реальном времени, если вы чувствуете потребность и хотите провести время.

Lucene и Сфинкс-хорошие варианты, как и приходит Xapian, что приятно и легкий. Если вы идете по пути Люсена, не предполагайте, что Clucene будет лучше, даже если вы предпочитаете не бороться с Java, хотя я не очень квалифицирован, чтобы обсуждать плюсы и минусы того и другого.


вместе с общим прекращением MyISAM,InnoDB полнотекстовый поиск (FTS), наконец, доступен в выпуске MySQL 5.6.4.

от http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html#innodb-fulltext-index:

эти индексы физически представлены как целые таблицы InnoDB, на которые действуют ключевые слова SQL, такие как предложение FULLTEXT инструкции CREATE INDEX, MATCH() ... Против синтаксиса в инструкции SELECT и инструкции OPTIMIZE TABLE.

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


вы должны потратить час и пройти через установку и тест-драйв от Sphinx и Lucene. Посмотрите, соответствует ли это вашим потребностям в отношении обновлений данных.

одна из вещей, которая разочаровала меня в Сфинксе, заключается в том, что он не поддерживает инкрементные вставки очень хорошо. То есть, очень дорого переиндексировать после вставки, настолько дорого, что их рекомендуемое решение-разделить ваши данные на более старые, неизменяемые строки и более новые, изменчивые строки. Так что каждый поиск вашего приложения нужно будет искать дважды: один раз по большему индексу для старых строк, а также по меньшему индексу для последних строк. Если это не интегрируется с вашими шаблонами использования, этот сфинкс не является хорошим решением (по крайней мере, в его текущей реализации).

Я хотел бы указать на другое возможное решение, которое вы могли бы рассмотреть:Google Пользовательский Поиск. Если вы можете применить SEO к своему веб-приложению, затем передать функцию индексирования и поиска на аутсорсинг Google и внедрить Поле поиска Google на ваш сайт. Это может быть самый экономичный и масштабируемый способ сделать ваш сайт доступным для поиска.


возможно, Вам не следует так быстро отклонять FT MySQL. Craigslist использовал его.

Скорость MySQL и полнотекстовый поиск позволили craigslist обслуживать своих пользователей .. craigslist использует MySQL для обслуживания примерно 50 миллионов запросов в месяц со скоростью до 60 запросов в секунду."

редактировать

Как прокомментировано ниже, Craigslist, похоже, имеет переключился на Сфинкса некоторое время в начале 2009 года.


Сфинкс, как вы указываете, довольно хорош для этого материала. Вся работа находится в конфигурационном файле. Убедитесь, что в вашей таблице со строками есть уникальный ключ integer id, и все будет в порядке.


попробуй такое

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0

вы должны взглянуть на Сфинкса. Стоит попробовать. Это индексирование очень быстро, и оно распространяется. Вы должны взглянуть на это (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown вебминар. Он говорит о поиске и имеет некоторые четкие ориентиры. Вы можете найти это полезным.


Если все остальное не удается, всегда есть soundex_match, который, к сожалению, не очень быстро, точный