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


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

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

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

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

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

8 91

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, который, к сожалению, не очень быстро, точный