Полнотекстовый поиск с InnoDB
Я разрабатываю крупномасштабное веб-приложение, где частью его является база данных MySQL дискуссионных сообщений, которая должна будет плавно расти до 20 м+ строк.
Я изначально планировал использовать MyISAM для таблиц (для встроенного возможности полнотекстового поиска), но думал о всю таблицу будучи заблокирован из-за одной операции записи делает меня затвор. Блокировки на уровне строк имеют гораздо больше смысла (не говоря уже о другой скорости InnoDB преимущества при работе с огромными таблицами). Итак, по этой причине я довольно решительно настроен использовать InnoDB.
проблема... InnoDB не имеет встроенных возможностей полнотекстового поиска.
должен ли я использовать стороннюю поисковую систему? Как Lucene (c++)/Сфинкс? У кого-нибудь из вас базы данных ниндзя есть какие-либо предложения/рекомендации? в LinkedIn zoie в этой игре (на основе Lucene) выглядит как лучший вариант на данный момент... будучи построен вокруг возможностей реального времени (что довольно важно для моего приложения.) Я немного сомневаюсь, чтобы совершить еще без некоторого понимания...
(для справки: собираюсь быть на EC2 с большим объемом памяти установок, использование PHP для обслуживания веб-интерфейс)
8 ответов:
Я могу поручиться за то, что MyISAM fulltext является плохим вариантом - даже оставляя в стороне различные проблемы с таблицами MyISAM в целом, я видел, что полнотекстовые материалы сходят с рельсов и начинают разрушать себя и регулярно рушить MySQL.
выделенная поисковая система, безусловно, будет самым гибким вариантом здесь - хранить данные post в MySQL/innodb, а затем экспортировать текст в поисковую систему. Вы можете настроить периодическую сборку/публикацию полного индекса довольно легко и добавить обновление индекса в режиме реального времени, если вы чувствуете необходимость и хотите провести время.
Lucene и Сфинкс-хорошие варианты, как и Xapian, что приятно и легкий. Если вы идете по маршруту Lucene, не предполагайте, что Clucene будет лучше, даже если вы предпочитаете не бороться с Java, хотя я не очень квалифицирован, чтобы обсуждать плюсы и минусы любого из них.
вместе с общим прекращением MyISAM, InnoDB полнотекстовый поиск (FTS), наконец, доступен в MySQL 5.6.4 release.
от 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. Смотрите, если любой из них соответствует вашим потребностям, в отношении обновления данных.
одна из вещей, которая разочаровала меня в Sphinx, заключается в том, что он не очень хорошо поддерживает инкрементные вставки. То есть очень дорого переиндексировать после вставки, так дорого, что их рекомендуемое решение-разделить ваши данные на более старые, неизменные строки и более новые, изменчивые строки. Так что каждый поиск вашего приложения does придется искать дважды: один раз по большему индексу для старых строк, а также по меньшему индексу для последних строк. Если это не интегрируется с вашими шаблонами использования, этот сфинкс не является хорошим решением (по крайней мере, не в его текущей реализации).
Я хотел бы указать на другое возможное решение, которое вы могли бы рассмотреть: Google Custom Search. Если вы можете применить некоторые SEO к своему веб-приложению, а затем передать функцию индексирования и поиска на аутсорсинг в Google и встроить Поле поиска Google на ваш сайт. Это может быть самый экономичный и масштабируемый способ сделать ваш сайт доступным для поиска.
возможно, Вам не следует так быстро отклонять FT MySQL. Craigslist использовал его.
Скорость MySQL и полнотекстовый поиск позволили craigslist обслуживать своих пользователей .. craigslist использует MySQL для обслуживания примерно 50 миллионов запросов в месяц со скоростью до 60 запросов в секунду."edit
Как прокомментировано ниже, Craigslist, похоже, имеет переключился на Сфинкса некоторое время в начале 2009 года.
Сфинкс, как вы указываете, довольно хорош для этого материала. Вся работа находится в конфигурационном файле. Убедитесь, что все, что ваша таблица со строками имеет некоторый уникальный целочисленный ключ 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, который, к сожалению, не очень быстро, точный