Я разрабатываю крупномасштабное веб-приложение, часть которого представляет собой базу данных MySQL дискуссионных сообщений, которые должны плавно увеличиваться до 20 миллионов строк.
Изначально я планировал использовать MyISAM для таблиц (для встроенных возможностей полнотекстового поиска ), но мысль о блокировке всей таблицы из-за одной операции записи заставляет меня заткнуться. Блокировки на уровне строк имеют гораздо больше смысла (не говоря уже о других преимуществах скорости InnoDB при работе с огромными таблицами). Итак, по этой причине я полон решимости использовать InnoDB.
Проблема в том, что ... InnoDB не имеет встроенных возможностей полнотекстового поиска.
Стоит ли мне использовать стороннюю поисковую систему? Как Lucene (c ++) / Sphinx ? Есть ли у кого-нибудь из вас, ниндзя базы данных, какие-нибудь предложения / рекомендации?LinkedIn zoie (основанный на Lucene) выглядит лучшим вариантом на данный момент... будучи построенным на возможностях реального времени (что очень важно для моего приложения), я немного не решаюсь совершить коммит, но без некоторого понимания ...
(FYI: будет на EC2 с установками с большим объемом памяти, с использованием PHP для обслуживания интерфейса)
Ответы:
Я могу поручиться за то, что полнотекстовый MyISAM - плохой вариант - даже если не брать в расчет различные проблемы с таблицами MyISAM в целом, я видел, как полнотекстовый материал сходил с рельсов и начал разрушаться и регулярно давать сбой MySQL.
Выделенная поисковая система определенно будет наиболее гибким вариантом здесь - храните данные публикации в MySQL / innodb, а затем экспортируйте текст в свою поисковую систему. Вы можете довольно легко настроить периодическое создание / публикацию полного индекса и добавлять обновления индекса в реальном времени, если чувствуете необходимость и хотите потратить время.
Lucene и Sphinx - хорошие варианты, как и Xapian , который приятен и легкий. Если вы пойдете по пути Lucene, не предполагайте, что Clucene будет лучше, даже если вы предпочитаете не бороться с Java, хотя я не совсем квалифицирован, чтобы обсуждать плюсы и минусы того и другого.
источник
Наряду с общим отказом от MyISAM, полнотекстовый поиск InnoDB (FTS) наконец доступен в версии MySQL 5.6.4.
Множество пикантных подробностей на https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html .
В то время как другие движки имеют множество различных функций, это InnoDB, поэтому он родной (что означает, что есть путь обновления), и это делает его стоящим вариантом.
источник
Вам нужно потратить час и пройти установку и тест-драйв Sphinx и Lucene. Посмотрите, соответствует ли какой-либо из них вашим потребностям в отношении обновления данных.
В Sphinx меня разочаровало то, что он не очень хорошо поддерживает инкрементные вставки. То есть переиндексировать после вставки очень дорого, настолько дорого, что их рекомендуемым решением является разделение данных на более старые неизменяемые строки и новые изменчивые строки. Таким образом, каждый поиск, выполняемый вашим приложением, должен будет выполняться дважды: один раз по большему индексу для старых строк, а также по меньшему индексу для последних строк. Если это не согласуется с вашими шаблонами использования, этот Sphinx не является хорошим решением (по крайней мере, не в его текущей реализации).
Я хотел бы указать на еще одно возможное решение, которое вы могли бы рассмотреть: пользовательский поиск Google . Если вы можете применить SEO к своему веб-приложению, то передайте функцию индексирования и поиска Google на аутсорсинг и вставьте текстовое поле поиска Google на свой сайт. Это может быть наиболее экономичный и масштабируемый способ сделать ваш сайт доступным для поиска.
источник
Возможно, вам не стоит так быстро отказываться от MySQL FT. Craigslist использовал это раньше .
редактировать
Как указано ниже, Craigslist, похоже, перешел на Sphinx в начале 2009 года.
источник
Сфинкс, как вы отметили, очень хорош для этого. Вся работа находится в конфигурационном файле. Убедитесь, что ваша таблица со строками имеет уникальный целочисленный ключ идентификатора, и все будет в порядке.
источник
попробуй это
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 , что, к сожалению, не очень быстрое и точное
источник
Для тех, кто застрял на более старой версии MySQL / MariaDB (т.е. пользователи CentOS), где InnoDB не поддерживает полнотекстовый поиск, моим решением при использовании таблиц InnoDB было создание отдельной таблицы MyISAM для того, что я хотел найти.
Например, моя основная таблица InnoDB была
products
с различными ключами и ссылочной целостностью. Затем я создал простой MyISAM таблицу с именем ,product_search
содержащий два поля,product_id
иproduct_name
где последний был установлен вFULLTEXT
индекс. Оба поля фактически являются копией того, что находится в основнойproduct
таблице.Затем я выполняю поиск в таблице MyISAM, используя полнотекстовый поиск, и выполняю внутреннее присоединение к таблице InnoDB.
Содержимое таблицы MyISAM можно поддерживать в актуальном состоянии с помощью триггеров или модели приложения.
Я бы не рекомендовал это, если у вас есть несколько таблиц, требующих полнотекстового поиска, но для одной таблицы это кажется подходящим решением, пока вы не сможете выполнить обновление.
источник