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

93

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

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

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

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

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

Brianreavis
источник

Ответы:

50

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

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

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

Ян Уилкс
источник
7
Solr (на основе Lucene) может сильно масштабироваться, он очень мощный и гибкий. Мы использовали Solr (в частности, версию LucidWorks для Solr), и я могу сказать, что это огромная победа. У Sphinx есть серьезные обещания, но в конечном итоге отсутствие типов данных может вызывать беспокойство, по крайней мере, для нашего приложения. Sphinx очень быстр, и, если он соответствует вашим потребностям, тоже хороший выбор.
Cody Caughlan
Спасибо вам двоим; отличные отзывы. Я пролистывал документы Solr, и, похоже, это отличное решение. Я вижу, что он также поддерживает довольно много крупных веб-сайтов. Я думаю, что Солр - лучший вариант. Спасибо ребята. Кроме того, было бы хорошо узнать о ваших головных болях с MyISAM, Ян ... об этом будет хорошо помнить в будущем. В других проектах я не буду пытаться использовать полнотекстовую функцию.
brianreavis
11
Интересно, что заставило Яна сказать: «Не думайте, что Клюсен будет лучше»? Как один из ключевых разработчиков clucene, я, возможно, не столь объективен, но мне кажется, что оптимизированный порт C ++ любой библиотеки Java резко повысит ее производительность. Я бы рекомендовал никому не публиковать такие комментарии, не взглянув хотя бы на продукт, который они позорят.
Synhershko
4
Когда вы хлопаете MyISAM, вам действительно нужно быть более конкретным. «Off the rails» очень расплывчато, и, возможно, из-за единственной ошибки в сборке, которую вы использовали, возможно, уже исправленной.
bobobobo
6
Но что, если у вас нет возможности устанавливать программное обеспечение на сервер - какие альтернативы существуют в этом случае?
acme
57

Наряду с общим отказом от MyISAM, полнотекстовый поиск InnoDB (FTS) наконец доступен в версии MySQL 5.6.4.

Множество пикантных подробностей на https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html .

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

Джереми Смит
источник
1
Ссылка на статью 403 запрещена
Марко Демайо
11

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

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

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

Билл Карвин
источник
Спасибо, Билл. Да, документация Sphinx заставила меня немного задуматься о том, как он обрабатывает обновления индекса. Хорошо, что это подтвердилось. Думаю, такая система, вероятно, превратилась бы для меня в кошмар. Что касается пользовательского поиска Google, это вариант. Однако моя основная проблема - это просто индекс не в реальном времени и отсутствие настройки. Для меня очень важны стилизация результатов и получение дополнительных данных. Тем не менее, спасибо за участие - информацию о Сфинксе, безусловно, полезно знать!
brianreavis
3

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

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

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

Как указано ниже, Craigslist, похоже, перешел на Sphinx в начале 2009 года.

бобобобо
источник
В статье, на которую я ссылался, не упоминается Сфинкс, и Ник не цитирует никаких источников, говорящих, что Craigslist вообще использует Сфинкса
bobobobo
PDF-файл с тематическим исследованием выглядит с 2004 года, когда было 50 миллионов запросов в месяц. На странице Sphinx указано 50 миллионов запросов в день , что, вероятно, объясняет причину перехода на специализированное поисковое решение.
Halil Özgür
1

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

Грегг Линд
источник
0

попробуй это

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
Ракеш Оджа
источник
0

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

Мухаммад
источник
0

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

user1612250
источник
0

Для тех, кто застрял на более старой версии MySQL / MariaDB (т.е. пользователи CentOS), где InnoDB не поддерживает полнотекстовый поиск, моим решением при использовании таблиц InnoDB было создание отдельной таблицы MyISAM для того, что я хотел найти.

Например, моя основная таблица InnoDB была productsс различными ключами и ссылочной целостностью. Затем я создал простой MyISAM таблицу с именем , product_searchсодержащий два поля, product_idи product_nameгде последний был установлен в FULLTEXTиндекс. Оба поля фактически являются копией того, что находится в основной productтаблице.

Затем я выполняю поиск в таблице MyISAM, используя полнотекстовый поиск, и выполняю внутреннее присоединение к таблице InnoDB.

Содержимое таблицы MyISAM можно поддерживать в актуальном состоянии с помощью триггеров или модели приложения.

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

MrCarrot
источник