Jump to content
Sign in to follow this  
dess81

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
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

Share this post


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

Share this post


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

}

Share this post


Link to post
Share on other sites

Как можно сделать поиск одновременно по наименованию и по модели?

Share this post


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

}

Share this post


Link to post
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" и.т.д.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.