Частичный поиск по ключевым словам - PullRequest
0 голосов
/ 10 июня 2011

Может ли кто-нибудь дать мне представление о том, как я могу выполнять частичный поиск по ключевым словам с помощью поисковой системы php / mysql?

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

Другой пример: если я ввел «апельсиновый сок», я хочу, чтобы он возвращал результат с ключевыми словами «апельсиновый сок имеет приятный вкус»

Это похоже на поиск в Google и YouTube.

Код, который я использую: http://tinypaste.com/eac6cf

Ответы [ 3 ]

0 голосов
/ 10 июня 2011

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

В компании, в которой я работаю, мы выдвигаем наши поисковые запросы на Sphinx . Такие сайты, как Craigslist, The Pirate Bay, Slashdot, все используют это, так что это в значительной степени доказано для промышленного использования.

0 голосов
/ 10 июня 2011

В MySQL вы можете использовать таблицу типов MyISAM и просто определить текстовое поле (CHAR, VARCHAR или TEXT), а затем создать индекс FULLTEXT. Просто помните о размере текстового поля, чем больше разрешенных символов, тем больше размер индекса и тем медленнее будет обновление.

Другие варианты больших наборов данных могут включать что-то вроде Solr , но если вы уже не знаете, что ваши данные будут содержать массу данных, вы, безусловно, могли бы начать с MySql и посмотреть, как это происходит.

Большинство редакторов MySQL, включая phpmyadmin, предоставляют графический интерфейс для добавления индексов, если вы делаете это вручную, код будет выглядеть примерно так:

CREATE TABLE IF NOT EXISTS `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `ft_name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
0 голосов
/ 10 июня 2011

Метод поиска, который вы использовали, является стандартным методом поиска из небольшого количества записей.Например, если бы у вас было около тысячи записей, это было бы нормально.

Но если вам нужно искать по миллионам записей, этот метод использовать не следует, поскольку он будет ужасно медленным.

Скорее у вас есть два варианта.

  1. Разнесите ваше поле поиска и создайте свой собственный индекс, содержащий отдельные слова и ссылку на позицию записи.Затем выполняйте только поиск по индексу и ищите соответствующую запись в основной таблице.

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

...