Является ли полнотекстовый поиск ответом? - PullRequest
9 голосов
/ 05 марта 2009

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

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

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

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

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

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

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

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

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

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

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

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

обновление

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

Ответы [ 3 ]

9 голосов
/ 05 марта 2009

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

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

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

Плюсы

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

Против

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

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

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

2 голосов
/ 05 марта 2009

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

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

1 голос
/ 05 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...