dess81

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

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

dess81    10

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
YaSe    23

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lextor    9

Файл - 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)) . "%' ";
  
   }
Тогда должно по вхождению всей строки в таком же порядке слов.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
dess81    10

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lextor    9

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

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ig52    3

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lextor    9


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

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ddmx    0

Файл - 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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу