Повний текст пошуку за допомогою InnoDB


93

Я розробляю великомасштабний веб-додаток, де його частина - це база даних MySQL дискусійних дописів, якій потрібно плавно зрости до 20М + рядків.

Я спочатку планував використовувати MyISAM для таблиць (для вбудованих можливостей повнотекстового пошуку ), але думка про блокування всієї таблиці завдяки одній операції запису змушує заткнутися. Замки на рівні рядків мають набагато більше сенсу (не кажучи вже про інші переваги швидкості InnoDB при роботі з величезними таблицями). Отож, з цієї причини я досить налаштований використовувати InnoDB.

Проблема полягає в тому, що ... InnoDB не має вбудованих можливостей повнотекстового пошуку.

Чи варто звертатися до сторонньої пошукової системи? Як люцена (с ++) / сфінкса ? Чи маєте хтось із вас ніндзя баз даних якісь пропозиції / вказівки?Зоя LinkedIn (базується на люцені ) виглядає найкращим варіантом на даний момент... будучи на базі можливостей у реальному часі (що досить важливо для мого застосування). Я трохи не вагаюся, щоб зробити це ще без певного розуміння ...

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


Відповіді:


50

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

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

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


7
Solr (заснований на люцені) може мати масштабний масштаб і дуже потужний і гнучкий. У нас є Solr (зокрема, LucidWorks для Solr), і я можу сказати, що це була величезна перемога. Сфінкс також має серйозні обіцянки, але в кінцевому рахунку його відсутність типів даних може викликати занепокоєння, як мінімум, для нашого застосування. Сфінкс дуже швидкий, і якщо він відповідає вашим потребам, це також ґрунтовний вибір.
Коді Каулан

Дякую купу вам двом; чудові відгуки. Я роздумував над документами Солра, і, здається, це чудове рішення. Я бачу, що це дуже багато величезних веб-сайтів. Я думаю, що Solr - квиток. Спасибі, хлопці. Крім того, добре дізнатися про головні болі в MyISAM, Іен ... про це буде добре мати на увазі в майбутньому. В інших проектах я відхиляюся від спроб використання функції повнотексту.
brianreavis

11
Цікаво, що змусило Іана сказати: «Не припускайте, що Клуцен буде кращим»? як одна з ключових команд clucene, я можу бути не настільки об'єктивним, але мені здається, що оптимізований C ++ порт будь-якої бібліотеки Java підвищить його ефективність на даху. Я б рекомендував нікому не публікувати подібні коментарі, не маючи принаймні погляду на продукт, який вони ганьблять.
synhershko

4
Коли ви б'єте MyISAM, вам потрібно бути більш конкретним. "Поза рейки" дуже розпливчастий, і це може бути тому, що одна помилка у використанні, яку ви використовували, можливо, після виправлення.
bobobobo

6
Але що робити, якщо у вас немає можливості встановлювати програмне забезпечення на сервер - які альтернативи існують у цьому випадку?
акме

56

Поряд із загальним припиненням роботи MyISAM, InnoDB повнотекстовий пошук (FTS), нарешті, доступний у випуску MySQL 5.6.4.

Багато соковитих деталей на https://dev.mysql.com/doc/refman/5.6/uk/innodb-fulltext-index.html .

Хоча інші двигуни мають багато різних функцій, цей InnoDB, тому він є рідним (а це означає, що є шлях до оновлення), і це робить його корисним варіантом.


1
Посилання на статтю 403 заборонено
Марко Демайо

11

Вам слід витратити годину та пройти встановлення та тест-драйв Сфінкса та Люцена. Перевірте, чи відповідає вашим потребам стосовно оновлень даних.

Одна з речей, яка мене розчарувала щодо Сфінкса, - це те, що він не дуже добре підтримує додаткові вставки. Тобто, повторно встановити після вставки дуже дорого, щоб їх рекомендованим рішенням було розділити ваші дані на старі, незмінні рядки та нові, мінливі рядки. Таким чином, для кожного пошуку ваш додаток повинен був би здійснити пошук двічі: один раз за більшим індексом для старих рядків, а також за меншим індексом для останніх рядків. Якщо це не інтегрується з вашими моделями використання, цей Сфінкс не є хорошим рішенням (принаймні, не в його поточній реалізації).

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


Дякую, Білл. Так, документація на Сфінкс змусила мене трохи роздуватися, як вона обробляє оновлення індексу. Добре, що це підтвердили. Така система, мабуть, перетвориться на кошмар для мене, я думаю. Щодо користувацького пошуку Google, це варіант. Однак моя головна проблема в цьому - лише індекс в режимі реального часу та відсутність персоналізації. Стилізація результатів та отримання додаткових даних будуть для мене досить важливими. Дякуємо, що задзвонили, хоча --- інформацію про Сфінкса, звичайно, добре знати!
brianreavis

3

Можливо, вам не слід так швидко відмовлятися від FT MySQL. Craigslist використовував його .

Швидкість і повний пошук MySQL дозволили Craigslist обслуговувати своїх користувачів .. craigslist використовує MySQL для обслуговування приблизно 50 мільйонів пошукових запитів на місяць зі швидкістю до 60 пошуків в секунду. "

редагувати

Як коментується нижче, Craigslist, здається, перейшов на Сфінкс деякий час на початку 2009 року.


У статті, яку я пов’язував, не згадується про Сфінкса, і Нік не цитує жодного джерела, в якому сказано, що Craigslist взагалі використовує Сфінкс
bobobobo

Тематичний PDF-файл схожий на 2004 рік, в цей час було 50 мільйонів пошуків на місяць. На сторінці Сфінкса зазначено 50 мільйонів пошукових запитів на день , що, ймовірно, пояснює причину переходу на спеціальне пошукове рішення.
Halil Özgür

1

Сфінкс, як ви зазначаєте, цілком приємний для цього матеріалу. Вся робота знаходиться у файлі конфігурації. Переконайтесь, що у вашій таблиці з рядками є якийсь унікальний цілочисельний ідентифікаційний ключ, і вам слід добре.



0

Слід поглянути на Сфінкс. Варто спробувати. Його індексація дуже швидка і вона поширюється. Слід поглянути на цей (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) веб-мінус. Він говорить про пошук і має деякі акуратні орієнтири. Вам це може бути корисним.



0

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

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

Потім я шукаю в таблиці MyISAM за допомогою fulltext і роблю внутрішнє з'єднання до таблиці InnoDB.

Вміст таблиці MyISAM можна оновлювати через тригери чи модель програми.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.