Полнотекстовый поиск с помощью InnoDB

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

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

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

Должен ли я пойти с сторонней поисковой системой? Как Lucene (c ++) / Sphinx ? Есть ли у вас какие-нибудь предложения или рекомендации по базе данных? LinkedIn's zoie (основанный на Lucene) выглядит как лучший вариант на данный момент … был построен вокруг возможностей в реальном времени (что довольно важно для моего приложения.) Я немного нерешительно, чтобы совершить еще без какой-либо проницательности …

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

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

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

Lucene и Sphinx – хорошие варианты, как и Xapian , который хорош и легковес. Если вы идете на маршрут Lucene, не предполагайте, что 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 () … AGAINST в инструкции SELECT и оператор OPTIMIZE TABLE.

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

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

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

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

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

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

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

Как отмечалось ниже, Craigslist, похоже, переключился на Sphinx некоторое время в начале 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) webminar. Он говорит о поиске и имеет некоторые опрятные ориентиры. Вы можете найти это полезным.

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