Автор Тема: При поиске ТИРЕ разделяет слова  (Прочитано 214 раз)

05 Октября 2015, 23:47:11
  • Фрилансер
  • *
  • Сообщений: 193
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Prestashop 1.6.14

Искать подстроку - ДА
Поиск точного совпадения с окончанием - НЕТ
Минимальная длинна слова  - 2

Если искать  PG-20 , преста найдет и все товары с PG и все товары с 20. Так не должно быть т.к. есть конкретный товар PG-20
Тире как-то разделяет слова. Как это убрать.

Надо ли переиндексировать после изменения настроек поиска ? Как я понял при изменении минимальной длинны - надо.

Или это причина в индексаторе ?
06 Октября 2015, 08:46:17
Ответ #1
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 20888
  • Репутация: +25279/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
В файле /classes/Search.php метод
public static function sanitize($string, $id_lang, $indexation = false, $iso_code = false)в нем происходит обработка перед поиском.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
06 Октября 2015, 10:06:07
Ответ #2
  • Фрилансер
  • *
  • Сообщений: 193
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
А индексация идет средствами Prestashop или Mysql ? Какой фаил ее выполняет ?
06 Октября 2015, 12:26:49
Ответ #3
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33028
  • Репутация: +26761/-0
    • Просмотр профиля
Поиск в prestashop
/classes/Search.php
/controllers/front/SearchController.php
14 Октября 2015, 10:00:46
Ответ #4
  • Фрилансер
  • *
  • Сообщений: 193
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В SearchControler ничего не нашел полезного.

А в Search.php много всего и мне не совсем понятно. Пожалуйста помогите найти где это Тире убирается.
В приложении этот фаил Search.php ( измененй нет)

Там была строка.
$string = ltrim(preg_replace('/([^ ])-/', '$1 ', ' '.$string));

Еще там есть PREG_CLASS_SEARCH_EXCLUDE - список кодов для удаления как я понимаю.
И еще PREG_CLASS_PUNCTUATION - там я тоже нашел код Тире и Минуса и убрал.

Все без толку.

Для чего нужны СТОП слова в поиске ?  Туда тире ставил, тоже не помогло.
14 Октября 2015, 10:23:06
Ответ #5
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22215
  • Репутация: +17111/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
$string = ltrim(preg_replace('/([^ ])-/', '$1 ', ' '.$string));здесь вырезается тире
Стоп слова, это служебные слова, такие как предлоги и т.д. Из поиска нужно вырезать. Смысл они не несут, поэтому не должны обрабатываться.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
14 Октября 2015, 18:34:00
Ответ #6
  • Фрилансер
  • *
  • Сообщений: 193
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если убрать эту строку, то он с тире ничего не находит.

Может ли помочь какой-то внешний модуль ? Или они все используют стандартные классы ?
14 Октября 2015, 19:39:26
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 13630
  • Репутация: +14563/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Все модули использут классы prestashop.
Предворительная обрабока запроса:
if ($indexation) {
        $string = preg_replace('/[._-]+/', ' ', $string);
} else {
        $string = preg_replace('/[._]+/', '', $string);
        $string = ltrim(preg_replace('/([^ ])-/', '$1 ', ' '.$string));
        $string = preg_replace('/[._]+/', '', $string);
        $string = preg_replace('/[^\s]-+/', '', $string);
}
если хотите оставить тире, то удалите везде знак "-".