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

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

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

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

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

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


person brianreavis    schedule 04.09.2009    source источник


Ответы (9)


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

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

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

person Ian Wilkes    schedule 04.09.2009
comment
Solr (на основе Lucene) может сильно масштабироваться, он очень мощный и гибкий. Мы использовали Solr (в частности, версию LucidWorks для Solr), и я могу сказать, что это огромная победа. У Sphinx есть серьезные обещания, но в конечном итоге отсутствие типов данных может вызывать беспокойство, по крайней мере, для нашего приложения. Sphinx очень быстр, и, если он соответствует вашим потребностям, тоже хороший выбор. - person Cody Caughlan; 05.09.2009
comment
Спасибо вам двоим; отличные отзывы. Я пролистал документы Solr, и, похоже, это отличное решение. Я вижу, он поддерживает и несколько крупных веб-сайтов. Я думаю, что Солр - лучший выбор. Спасибо, парни. Кроме того, было бы хорошо узнать о ваших головных болях с MyISAM, Ян ... об этом будет хорошо помнить в будущем. В других проектах я не буду пытаться использовать полнотекстовую функцию. - person brianreavis; 06.09.2009
comment
Интересно, что заставило Яна сказать: «Не думай, что Клюсен будет лучше»? Как один из ключевых разработчиков clucene, я, возможно, не столь объективен, но мне кажется, что оптимизированный порт C ++ для любой библиотеки Java резко повысит ее производительность. Я бы порекомендовал никому не публиковать такие комментарии, не взглянув хотя бы на продукт, который они бесчестят. - person synhershko; 19.10.2009
comment
Когда вы хлопаете MyISAM, вам действительно нужно быть более конкретным. Off the rails очень расплывчатый, и, возможно, из-за единственной ошибки в сборке, которую вы использовали, возможно, уже исправленной. - person bobobobo; 15.12.2010
comment
Но что делать, если у вас нет возможности устанавливать программное обеспечение на сервер - какие альтернативы существуют в этом случае? - person acme; 11.02.2011
comment
@synhershko: Среди профессионалов общеизвестно, что перенос Java-приложения на C ++ обычно не приводит к резкому увеличению его производительности; прямой перевод с использованием idomatic C ++ обычно дает очень скромный прирост (около 30-50%) - person BlueRaja - Danny Pflughoeft; 30.05.2013

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

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

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

person Jeremy Smyth    schedule 22.02.2012
comment
Ссылка на статью 403 запрещена - person Marco Demaio; 07.02.2013

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

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

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

person Bill Karwin    schedule 04.09.2009
comment
Спасибо, Билл. Да, документация Sphinx заставила меня немного сомневаться в том, как она обрабатывает обновления индекса. Хорошо, что это подтвердилось. Думаю, такая система, вероятно, превратилась бы для меня в кошмар. Что касается пользовательского поиска Google, это вариант. Однако моя основная проблема - это просто индекс не в реальном времени и отсутствие настройки. Для меня очень важны стилизация результатов и получение дополнительных данных. Спасибо за участие - информация о Сфинксе, безусловно, полезна! - person brianreavis; 06.09.2009

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

MySQL’s speed and Full Text Search has enabled craigslist to serve their users .. craigslist uses MySQL to serve approximately 50 million searches per month at a rate of up to 60 searches per second."

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

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

person bobobobo    schedule 15.12.2010
comment
В статье, на которую я ссылался, не упоминается Sphinx, и Ник не цитирует никаких источников, говорящих, что Craigslist вообще использует Sphinx. - person bobobobo; 18.07.2011
comment
PDF-документ с тематическим исследованием выглядит с 2004 года, когда ежемесячно выполнялось 50 миллионов запросов. На странице Sphinx указано 50 миллионов поисков в день, что, вероятно, объясняет причину перехода на специализированное поисковое решение. - person Halil Özgür; 19.07.2011

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

person Gregg Lind    schedule 04.09.2009

попробуй это

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
person Rakesh Ojha    schedule 12.05.2011

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

person Muhammad    schedule 18.09.2012

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

person user1612250    schedule 18.03.2013

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

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

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

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

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

person MrCarrot    schedule 02.06.2020