Является ли полнотекстовый поиск ответом?

ОК, у меня есть база данных MySQL, которая выглядит примерно так

ID - int и уникальный идентификатор записанного

Заголовок - название предмета

Описание - описание предметов

Я хочу найти и заголовок и описание ключевых слов, в настоящее время я использую.

SELECT * From 'item', где title LIKE %key%

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

Что касается вопроса, я слышал о чем-то, что называется "Полнотекстовый поиск", это (насколько я могу судить) основа дизайна базы данных, но, будучи новичком в этой теме, я ничего не знаю об этом, так что…

1) Как вы думаете, это будет полезно?

И дополнительный квестрон...

2) Что я могу прочитать о дизайне баз данных / поисковой системе, который укажет мне правильное направление.

Если он актуален, сайт в настоящее время написан на простом PHP (т.е. IE без фреймворка) (хотя мысль о его преобразовании в Ruby on Rails пришла мне в голову)

Обновить

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

3 ответа

Решение

Проблема с поиском типа "%keyword%" заключается в том, что нет способа эффективно выполнять поиск по нему в обычной таблице, даже если вы создаете индекс по этому столбцу. Подумайте, как бы вы выглядела эта строка в телефонной книге. На самом деле нет способа оптимизировать его - вам нужно сканировать всю телефонную книгу - и это то, что делает MySQL, полное сканирование таблицы.

Если вы измените этот поиск на "ключевое слово%" и воспользуетесь индексом, вы сможете получить очень быстрый поиск. Похоже, это не то, что вы хотите.

Имея это в виду, я довольно часто использовал полнотекстовое индексирование / поиск, и вот несколько плюсов и минусов:

Pros

  • Очень быстро
  • Возвращает результаты, отсортированные по релевантности (по умолчанию, хотя вы можете использовать любую сортировку)
  • Стоп слова могут быть использованы.

Cons

  • Работает только с таблицами MyISAM
  • Слишком короткие слова игнорируются (минимум 4 буквы по умолчанию)
  • Требуется другой SQL в предложении where, поэтому вам нужно будет изменить существующие запросы.
  • Не соответствует частичным строкам (например, "слово" не соответствует "ключевому слову", только "слово")

Вот хорошая документация по полнотекстовому поиску.

Другой вариант - использовать поисковую систему, такую ​​как Sphinx. Это может быть очень быстро и гибко. Он оптимизирован для поиска и хорошо интегрируется с MySQL.

Я предполагаю, что полный текст MySQL достаточен для ваших нужд, но стоит отметить, что встроенная поддержка не очень хорошо масштабируется. Для документов среднего размера он становится непригодным для таблиц размером от нескольких сотен тысяч строк. Если вы думаете, что это может стать проблемой в дальнейшем, вам, вероятно, стоит заглянуть в Sphinx. Это становится стандартом де-факто для пользователей MYSQL, хотя я лично предпочитаю реализовать собственное решение с использованием Java Lucene.:)

Кроме того, я хотел бы отметить, что полнотекстовый поиск принципиально отличается от стандартного LIKE "% ключевое слово%" - поиск. В отличие от LIKE-поиска, полнотекстовая индексация позволяет искать несколько ключевых слов, которые не должны появляться рядом друг с другом. Например, стандартные поисковые системы, такие как Google, являются полнотекстовыми поисковыми системами.

Вы также можете рассмотреть Zend_Lucene. Это немного легче интегрировать, чем Sphinx, потому что это чистый PHP.

Другие вопросы по тегам