Реализация поиска в базе данных по запросу, используя как - PullRequest
3 голосов
/ 28 июня 2010

Я планирую реализовать поиск по базе данных через веб-сайт - я знаю, что mysql предлагает полнотекстовый поиск, но оказывается, что он не поддерживается для механизма innodb (который мне нужен для поддержки транзакций).Другие варианты используют sphinx или подобные приложения индексации.Однако они требуют некоторого перефакторинга структуры базы данных и могут потребовать больше времени для реализации, чем я.

Итак, я решил взять каждую таблицу и объединить все соответствующие столбцы во вновь добавленный столбец QUERY.Этот столбец запроса должен также набирать из столбца других соответствующих таблиц.

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

Поскольку в моей базе данныхне ожидается, что он будет слишком большим (<1 млн строк в самой большой таблице), я ожидаю разумного времени запроса.</p>

Кто-нибудь согласен с этим методом или имеет лучшую идею?

Ответы [ 3 ]

6 голосов
/ 28 июня 2010

Вы не будете довольны решением использовать LIKE с подстановочными знаками. Он работает в сотни или тысячи раз медленнее, чем при использовании технологии полнотекстового поиска.

См. Мою презентацию Практический полнотекстовый поиск в MySQL .

Вместо копирования значений в столбец QUERY, я бы порекомендовал скопировать значения в таблицу MyISAM, в которой определен индекс FULLTEXT. Вы можете использовать триггеры для этого.

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

CREATE TABLE OriginalTable (
  original_id SERIAL PRIMARY KEY,
  author_id INT,
  author_date DATETIME,
  summary TEXT,
  body TEXT
) ENGINE=InnoDB;

CREATE TABLE SearchTable (
  original_id BIGINT UNSIGNED PRIMARY KEY, -- not auto-increment
  -- author_id INT,
  -- author_date DATETIME,
  summary TEXT,
  body TEXT,
  FULLTEXT KEY (summary, body)
) ENGINE=MyISAM;
1 голос
/ 28 июня 2010

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

Если вы выполняете поиск, отличный от «равно» (LIKE 'test') или «начинается с» (LIKE 'test%'), MySQL должен будет сканировать каждую строку. Например, поиск «содержит» (LIKE '%test%') не может использовать индекс.

Вы могли бы разрешить "заканчиваться на" ('LIKE %test), но вам нужно было бы построить обратный столбец для индексации, чтобы вы могли фактически сделать LIKE 'test%', чтобы использовать индекс.

Любое полное сканирование будет медленным, и чем больше строк, тем медленнее будет. Чем больше поле, тем медленнее оно будет.

Вы можете увидеть ограничение использования LIKE. Поэтому вы можете создать таблицу с именем «Теги», в которой вы будете привязывать отдельные ключевые слова к каждой записи, а не использовать весь текст, но я все равно буду придерживаться «равно» и «начинаться с», даже с тегами.

Использование LIKE без помощи индекса должно быть ограничено редким специальным запросом или очень маленькими наборами данных.

0 голосов
/ 28 июня 2010

Нет, это не оптимально, так как заставляет читать всю строку.Но если ваша таблица небольшая (я не знаю, что означает <1mn), то она может быть приемлемой в некоторой степени. </p>

Также вы можете ограничить функцию поиска.Например, некоторые сайты ограничивают использование функции поиска не более одного запроса в минуту, в то время как другие вынуждают вас вводить капчу.

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