Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Уменьшить глубину поиска


dess81

Recommended Posts

Когда ищешь товар через поиск в OpenStore 1.5.3.1, то почему-то выдает кучу ненужного товара.

Допустим, ищешь "Велосипед Stels 410". В результатах поиска высвечивает ВСЕ ВЕЛОСИПЕДЫ и товары с использованием "stels" и еще и цифр "410". Найти практически нереально что-то. Такое ощущение, что алгоритм поиска:

Найти "велосипед" или stels или "410". А должно быть найти фразу"Велосипед Stels 410" целиком. Иначе поиск выдает целые категории товаров и невозможно что-то найти. Не могу понять в чем проблема и как исправить. может модуль нужно ставить?

Надіслати
Поділитися на інших сайтах


Файл - catalog/model/catalog/product.php.

Функция - getProducts();

Рабочий код -

if (!empty($data['filter_name'])) {
	$implode = array();
  
	$words = explode(' ', $data['filter_name']);
	$words = array_filter(array_unique($words), 'strlen');
  
	foreach ($words as $word) {
	 if (!empty($data['filter_description'])) {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 } else {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 }  
	}
  
	if ($implode) {
	 $sql .= " " . implode(" OR ", $implode) . "";
	}
   }

Заменить на

	
   if (!empty($data['filter_name'])) {
$word=$data['filter_name'];
  
$sql .="LCASE(pd.name) ='" . $this->db->escape(utf8_strtolower($word)) ." ' ";
  
   }

Будет искать только по 100% совпадению.

или на

	
   if (!empty($data['filter_name'])) {
$word=$data['filter_name'];
  
$sql .="LCASE(pd.name)  LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' ";
  
   }
Тогда должно по вхождению всей строки в таком же порядке слов.

Не успел проверить все, но должно работать.

Не забудьте почистить кеш.

  • +1 1
Надіслати
Поділитися на інших сайтах


Файл - catalog/model/catalog/product.php.

Функция - getProducts();

Рабочий код -

if (!empty($data['filter_name'])) {
	$implode = array();
  
	$words = explode(' ', $data['filter_name']);
	$words = array_filter(array_unique($words), 'strlen');
  
	foreach ($words as $word) {
	 if (!empty($data['filter_description'])) {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 } else {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 }  
	}
  
	if ($implode) {
	 $sql .= " " . implode(" OR ", $implode) . "";
	}
   }

Заменить на

	
   if (!empty($data['filter_name'])) {
$word=$data['filter_name'];
  
$sql .="LCASE(pd.name) ='" . $this->db->escape(utf8_strtolower($word)) ." ' ";
  
   }

Будет искать только по 100% совпадению.

или на

	
   if (!empty($data['filter_name'])) {
$word=$data['filter_name'];
  
$sql .="LCASE(pd.name)  LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' ";
  
   }
Тогда должно по вхождению всей строки в таком же порядке слов.

Не успел проверить все, но должно работать.

Не забудьте почистить кеш.

Спасибо большое за помощь. Работает. Единственное, что хотелось бы, чтобы он порядок слов менял. Иначе если искать "Stels 410", то он вариант "Stels New Model 410" не найдет. Что также усложнит поиск

Надіслати
Поділитися на інших сайтах


if (!empty($data['filter_name'])) {

$word=$data['filter_name'];

$word=str_replace ( " ", "%", $word ); // Замена пробелов в строке поиска для MYSQL выборки.

$sql .="LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' ";

}

Надіслати
Поділитися на інших сайтах



if (!empty($data['filter_name'])) {

$word=$data['filter_name'];

$word=str_replace ( " ", "%", $word ); // Замена пробелов в строке поиска для MYSQL выборки.

$sql .="LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(p.model) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' ";

}

Надіслати
Поділитися на інших сайтах


Файл - catalog/model/catalog/product.php.

Функция - getProducts();

Рабочий код -

if (!empty($data['filter_name'])) {
	$implode = array();
  
	$words = explode(' ', $data['filter_name']);
	$words = array_filter(array_unique($words), 'strlen');
  
	foreach ($words as $word) {
	 if (!empty($data['filter_description'])) {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 } else {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 }  
	}
  
	if ($implode) {
	 $sql .= " " . implode(" OR ", $implode) . "";
	}
   }

Заменить на

	
   if (!empty($data['filter_name'])) {
$word=$data['filter_name'];
  
$sql .="LCASE(pd.name) ='" . $this->db->escape(utf8_strtolower($word)) ." ' ";
  
   }

Будет искать только по 100% совпадению.

или на

	
   if (!empty($data['filter_name'])) {
$word=$data['filter_name'];
  
$sql .="LCASE(pd.name)  LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' ";
  
   }
Тогда должно по вхождению всей строки в таком же порядке слов.

Не успел проверить все, но должно работать.

Не забудьте почистить кеш.

лучше сделать так:

1) в функции getProducts();

if (!empty($data['filter_name'])) {
		$implode = array();

		$words = explode(' ', $data['filter_name']);
		$words = array_filter(array_unique($words), 'strlen');

		foreach ($words as $word) {
		 if (!empty($data['filter_description'])) {
		  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
		 } else {
		  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
		 }
		}

		if ($implode) {
		 $sql .= " " . implode(" OR ", $implode) . "";
		}
   }
заменить

		if ($implode) {
		 $sql .= " " . implode(" OR ", $implode) . "";
		}

на

		if ($implode) {
		 $sql .= " " . implode(" AND ", $implode) . "";
		}

2)И в функции getTotalProducts();

if (!empty($data['filter_name'])) {
	$implode = array();
  
	$words = explode(' ', $data['filter_name']);
  
	foreach ($words as $word) {
	 if (!empty($data['filter_description'])) {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 } else {
	  $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
	 }  
	}
  
	if ($implode) {
	 $sql .= " " . implode(" OR ", $implode) . "";
	}
   }
заменить

		if ($implode) {
		 $sql .= " " . implode(" OR ", $implode) . "";
		}

на

		if ($implode) {
		 $sql .= " " . implode(" AND ", $implode) . "";
		}

В итоге будет искать по 100% совпадению + воспринимает любой порядок слов .

что бы найти "Велосипед Stels 410" можно вводить "410 Stels" , " велосипед 410" и.т.д.

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.