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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

Наряду с общим поэтапным отключением 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, поэтому он является родным (что означает наличие пути обновления), и это делает его подходящим вариантом.

Ответ 3

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

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

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

Ответ 4

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

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

изменить

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

Ответ 5

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

Ответ 6

попробуйте это

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

Ответ 7

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

Ответ 8

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