Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


dess81
 Поделиться

Рекомендованные сообщения

Когда ищешь товар через поиск в 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 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.