Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

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


dess81
 Share

Recommended Posts

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

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

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

Link to comment
Share on other sites


Зато по запросу

Виласипет стелс 410

посетитель сможет найти нужный товар и показать родителям :-D

Link to comment
Share on other sites

Файл - 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
Link to comment
Share on other sites


Файл - 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" не найдет. Что также усложнит поиск

Link to comment
Share on other sites


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)) . "%' ";

}

Link to comment
Share on other sites



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)) . "%' ";

}

Link to comment
Share on other sites


Файл - 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" и.т.д.

Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.