Полнотекстовый поиск для сайта OpenCart используя PHP + MySQL

Сегодня хочу рассказать о реализации полнотекстового поиска на проекте, «в ядре» которого используется OpenCart. Почему «в ядре», да потому, что 60% там переписано. Но, ближе к теме)

Технология поиска
В качестве технологии для полнотекстового поиска будем использовать FULLTEXT индекс таблицы MyISAM MySQL.
Я не буду расписывать полностью готовый и рабочий пример. Скорее опишу саму технологию, так сказать подход к решению задачи.

Описание задачи
Есть большое количество товара, в данном случае репродукции картин. У них есть параметры, назову их ключи поиска:
  • название работы,
  • автор,
  • категории,
  • теги.
Нужно реализовать полнотекстовый поиск по этим полям. Как дополнение, если полнотекстовый поиск не дал результатов то нужно выполнить поиск вхождения искомой строки в том же множестве ключей.

Реализация задачи
Для реализации полнотекстового поиска предлагаю сделать дополнительную таблицу в базе данных MySQL. Таблица будет хранить ID товара и строку, в которой будут собраны все искомые ключи для данного товара, разделённые пробелом.

Рекомендую хранить эти данные в верхнем/нижнем регистре, для упрощения процедуры поиска.
`product_id` 	int(10) 	
`search` 	text
так же нужно создать FULLTEXT индекс по полю `search`.

Пример обработчика запроса формы поиска Opencart:

/* ЗАПРОС К ПОИСКОВОЙ СИСТЕМЕ */
$search_string = ($this->request->get['filter_name']) ? $this->request->get['filter_name'] : ""; // если открыта страница поиска, но без поисковой фразы, то создаём пустую поисковую фразу
$search = mb_strtoupper($this->request->get['filter_name'], 'UTF-8'); // поднимаем в верхний регистр указываю кодировку UTF-8
$products = $this->model_tool_search->search($search); // посылаем запрос к базе данных
if (empty($products) && strlen($search) >= 3*2){
   $products = $this->model_tool_search->searchlk($search); // если запрос вернулся пустой и поисковая фраза длиннее 3х символов (2 байта на символ), запускаем поиск по вхождениям
}//if
/* КОНЕЦ -  ЗАПРОС К ПОИСКОВОЙ СИСТЕМЕ */

Теперь приведу код функций search() и searchlk()

function search($search){
        $sql = "SELECT product_id FROM `opencart_search` WHERE MATCH (search) AGAINST ('$search')";
        $qres = $this->db->query($sql);
        return $qres->rows;
    }

function searchlk($search){
        $sql = "SELECT product_id FROM `opencart_search` WHERE search LIKE '%$search%'";
        $qres = $this->db->query($sql);
        return $qres->rows;
    }


В моём случае, эти функции возвращают ID товара, по которым и формируется страница результатов поиска.

П.С. так казать для уточнения!
Полнотекстовый поиск производится при помощи запроса
SELECT `key` FROM `search_keys` WHERE MATCH (search_keys) AGAINST ('$search')

Ещё хочу добавить, что если у Вас большой ресурс и не обрезанный хостинг (например VPS), где вы имеете доступ к ДЕМОНАМ, то лучший вариант на сегодняшний день, это Sphinx.
  • +1
  • 10 февраля 2013, 11:27
  • igorrius

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
comments powered by Disqus