CommerCentr
UA
Увійти

Повнотекстовий пошук по опису товару FULLTEXT

#1
Доброго дня, шановні читачі, сьогодні поділюсь рішенням, по реалізації повнотекстового пошуку на сайті по полю description таблиці product_description.
Перераховувати всі переваги не буду, надам просто лінк [1, 2] для ознайомлення, а далі гуглопедією самостійно, тут тільки реалізація.

крок 0: визначаємо, чи стоїть тип FULLTEXT на індексованому полі description таблиці product_description:
виконати запит потрібно в phpMmyAdmin у вкладці SQL
SELECT column_name FROM INFORMATION_SCHEMA.STATISTICS WHERE (table_schema, table_name) = ('my_database', 'oc_product_description') AND index_type = 'FULLTEXT' ORDER BY seq_in_index

де my_database - назва бази даних (подивитись можна в файлі config.php в значенні константи DB_DATABASE)

якщо при виконанні цього запиту у вас показало поле description (як на малюнку), тоді у вас вже встановлений тип FULLTEXT то переходьте одразу до кроку 2
be00dea309.png
крок 1: додаємо тип FULLTEXT до поля description (виконуємо запит на тій самій вкладці phpMmyAdmin):
ALTER TABLE `oc_product_description` ADD FULLTEXT `description` (`description`)

якщо записів (товарів) в шопі багато, може зайняти якийсь час

крок 2: вносимо зміни в модель товару (catalog/model/catalog/product.php) у 2-х методах:
перший метод має назву getProducts, ось в тілі самого методу, знаходимо стрічку типу:
$sql .= " OR pd.description LIKE '%" . $this->db->escape($data['filter_name']) . "%'";

* будьте уважними, бо ця стрічка зустрічається в 2-х місцях, хоча в обидвох місцях, потрібно замінювати одинаково
знайшовши цю стрічку, замініть її повністю на ось цю:
$sql .= " OR MATCH(pd.description) AGAINST ('" . $this->db->escape($data['filter_name']) . "')";


другий метод, в котрому потрібно провести аналогічну операцію, має назву: getTotalProducts, в його тілі також знайдіть та замініть стрічку, як описано вище та збережіть зміни.

Приймайте вітання, тепер у вас в магазині реалізовано повнотекстовий пошук!

p.s. Якщо потрібно відкотити зміни чи повернутись до попереднього типу пошуку, тоді зробіть наступне:

виконайте запит в phpMmyAdmin у вкладці SQL
ALTER TABLE `oc_product_description` DROP INDEX `description`


у файлі catalog/model/catalog/product.php у 2-х методах:
перший метод має назву getProducts, ось в тілі самого методу, знаходимо стрічку в котрій робили зміни:
$sql .= " OR MATCH(pd.description) AGAINST ('" . $this->db->escape($data['filter_name']) . "')";

* будьте уважними, бо ця стрічка зустрічається в 2-х місцях, хоча в обидвох місцях, потрібно замінювати одинаково
знайшовши цю стрічку, замініть її повністю на ось цю:
$sql .= " OR pd.description LIKE '%" . $this->db->escape($data['filter_name']) . "%'";


другий метод, в котрому потрібно провести аналогічну операцію, має назву: getTotalProducts, в його тілі також знайдіть та замініть стрічку, як описано вище та збережіть зміни.Вкладення: be00dea309.png

Читати може будь-хто. Щоб писати й голосувати — увійдіть в акаунт.