kycher Posted July 21, 2020 Report Share Posted July 21, 2020 Доброго Нужно чтобы поиск работал по названиям товара и не отсекал спецсимволы (слеши и ковычки) и искал если даже в названии товара они присутствуют. Да это не безопасно, но не моя воля. Сейчас при вводе в поиск он заканчивает искать при вводе спецсимвола. Как вырезать? Файл в index.tpl шаблона - автозаполнитель поиска function(suggestion, currentValue){ var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'); var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')'; return (suggestion.data.image?"<img align=absmiddle src='"+suggestion.data.image+"'> ":'') + suggestion.value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>'); } Тут обрезает, удаление из него например слеша \ не дает результата. Далее, есть в файле js/jquery.autocomplete-min.js this.selection=null;this.initialize();this.setOptions(}var k=function(){return{escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},createNode:function(a){var b=document.createElement("div");b.className=a;b.style.position="absolute";b.style.display="none";return b}}}(); Удаление тут тоже не помогает. Куда смотреть ? api\Request.php ajax\search_products.php Спасибо за ответ. Quote Link to post Share on other sites
kozhushko8 Posted July 22, 2020 Report Share Posted July 22, 2020 api\Request.php if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\*\:\%\s]/ui', '', $val)); Quote Link to post Share on other sites
Dmitry86 Posted November 25, 2021 Report Share Posted November 25, 2021 (edited) Добрый день! Подскажите, как сделать, чтобы в поиске не учитывались пробел(ы) и тире? Например, есть товар, в котором сдержится название модели AB 30 с пробелом. Если в поиске забивать AB30 без пробела, то он не показывает этот товар сразу. То есть чтобы найти нужные товары нужно задать поиск именно с пробелом. И обратная ситуация, когда в названии товара может быть указано AB30 без пробела, а пользователь скопировал с другого сайта с пробелом и пытается найти этот товар. Получается он вставил в строку поиска или набрал руками AB 30 и не находит товар, хотя он есть. Аналогично с тире. В api\Request.php у меня выглядит так: return strval(preg_replace('/[^\p{L}\p{Nd}\d\@\s_\-\.\%\s]/ui', '', $val)); Edited November 25, 2021 by Dmitry86 Quote Link to post Share on other sites
phukortsin Posted November 25, 2021 Report Share Posted November 25, 2021 1 час назад, Dmitry86 сказал: Подскажите, как сделать, чтобы в поиске не учитывались пробел(ы) и тире? Зависит от того, как понимать "не учитывались". Простейший вариант - при обработке поисковой фразы удаляйте все пробелы и тире. Но это вряд ли даст тот результат, который хотите. Простыми средствами устранить недостатки, описанные в примерах, практически невозможно. Если пользователь ввел abcdefgh, то понять, что он имел в виду и что искать - 'abc defgh' или 'ab cdefgh'. А если длинное слитное слово разбивать на несколько частей, то вариантов будут тысячи... Quote Link to post Share on other sites
Dmitry86 Posted November 25, 2021 Report Share Posted November 25, 2021 10 минут назад, phukortsin сказал: Зависит от того, как понимать "не учитывались". Простейший вариант - при обработке поисковой фразы удаляйте все пробелы и тире. Но это вряд ли даст тот результат, который хотите. Простыми средствами устранить недостатки, описанные в примерах, практически невозможно. Если пользователь ввел abcdefgh, то понять, что он имел в виду и что искать - 'abc defgh' или 'ab cdefgh'. А если длинное слитное слово разбивать на несколько частей, то вариантов будут тысячи... Благодарю за ответ. Тут чисто технически, скорее всего, проще убирать все пробелы из названия товара при выборке и из строки поиска, и потом сравнивать их. Разве в этом случае я не получу желаемый результат? Независимо от того, что введет пользователь в строку поиска, с пробелом или без, нужно ему показать тот товар, у которого в названии есть вхождение искомого запроса с пробелами или без оных. Не важно, что имел ввиду пользователь, важно, чтобы набор этих символов был найден в названии товара, ведь 'abc defgh' и 'ab cdefgh', ведь, с точки зрения машины, будет = abcdefgh, если в названии товара убрать все пробелы, соотвественно товар будет показан пользователю как найденный. Делать гугл тут не надо, конечно. Поиск настолько примитивный, что он даже не найдет товар 'AB 30', если набрать '30 AB', но вот с пробелами решить хотелось бы. Иногда наблюдаю в Вебвизоре, как люди не находят желаемое и уходят с сайта только из-за того, что они не поставили пробел или наоборот поставили пробел в запросе в строке поиска. Может быть есть какие-то другие решения, кроме очистки от пробелов и тире каждого названия товара и поискового запроса пользователя.. Quote Link to post Share on other sites
phukortsin Posted November 27, 2021 Report Share Posted November 27, 2021 В 25.11.2021 в 17:21, Dmitry86 сказал: Благодарю за ответ. Тут чисто технически, скорее всего, проще убирать все пробелы из названия товара при выборке и из строки поиска, и потом сравнивать их. Разве в этом случае я не получу желаемый результат? Независимо от того, что введет пользователь в строку поиска, с пробелом или без, нужно ему показать тот товар, у которого в названии есть вхождение искомого запроса с пробелами или без оных. Не важно, что имел ввиду пользователь, важно, чтобы набор этих символов был найден в названии товара, ведь 'abc defgh' и 'ab cdefgh', ведь, с точки зрения машины, будет = abcdefgh, если в названии товара убрать все пробелы, соотвественно товар будет показан пользователю как найденный. Технически такое не сильно сложно. Создать доп поле названия, в него автоматически записать основное название без пробелов. И в алгоритм поиска внести изменения, чтоб по новому полю искалось соответствие для поисковой строки, из которой удалены пробелы. Но, скорее всего, получите другие сюрпризы - поиск будет выдавать много лишних товаров... В 25.11.2021 в 17:21, Dmitry86 сказал: Поиск настолько примитивный, что он даже не найдет товар 'AB 30', если набрать '30 AB' Стандартный основной поиск в такой ситуации находит нужное. Возможно, Вы имеете в виду "живой" поиск - алгоритмы поисков совсем разные... В 25.11.2021 в 17:21, Dmitry86 сказал: Может быть есть какие-то другие решения, кроме очистки от пробелов и тире каждого названия товара и поискового запроса пользователя.. Конечно, можно придумать много разных своих вариантов. Например, преобразовывать строку 'AB30' к виду 'AB 30' - по границе буквенной части и цифровой части. Надо пробовать конкретно на Вашем сайте с Вашим специфичными товарами, сразу в общем виде вряд ли решение кто даст... Quote Link to post Share on other sites
Dmitry86 Posted November 30, 2021 Report Share Posted November 30, 2021 В 27.11.2021 в 09:23, phukortsin сказал: Вы имеете в виду "живой" поиск Видимо его я имею ввиду, потому что интересует именно та часть, когда при вводе в строку поиска выпадают предложения с найденным товарами. Если я правильно понимаю, то эта часть относится к JS. В живом поиске можно не учитывать вводимые пробелы? То есть, независимо от того, как указано в названии товара, допустим 'AB30' или 'AB 30' или 'A B-30', то его можно найти даже указав с пробелами, без тире, или с тире в другом месте, например: 'AB 30' или 'A B30', или хоть 'A B-3 0'. Quote Link to post Share on other sites
phukortsin Posted December 1, 2021 Report Share Posted December 1, 2021 Весьма общие и сложные вопросы ставите. Попробуйте сначала на человеческом языке объяснить то, что хотите, с примерами, учитывающими все тонкости. И надо хоть немного понимать, как работает текстовый поиск, и учитывать это в постановке задачи. Quote Link to post Share on other sites
Dmitry86 Posted December 1, 2021 Report Share Posted December 1, 2021 3 часа назад, phukortsin сказал: Весьма общие и сложные вопросы ставите. Попробуйте сначала на человеческом языке объяснить то, что хотите, с примерами, учитывающими все тонкости. И надо хоть немного понимать, как работает текстовый поиск, и учитывать это в постановке задачи. Извините, не знаю, как ещё объяснить... Вроде, с примерами написал, что хотел бы увидеть.. Давайте по-другому попробую: живой поиск должен искать только буквы и цифры при наборе текста в строке поиска. Вводимые пользователем символы "пробел" и "тире" он должен игнорировать. Quote Link to post Share on other sites
phukortsin Posted December 2, 2021 Report Share Posted December 2, 2021 21 час назад, Dmitry86 сказал: живой поиск должен искать только буквы и цифры Бессмыслица. Поиск ищет не буквы, а ТОВАРЫ по соответствию текстов в поисковой фразе. Например, ввели поисковую строку 'мар', ей соответствуют товары, у которых в текстах (названия, меты, что-то другое) встречается 'марля' или 'мармелад' или 'амарант'. Уже сказано - пробуйте объяснить свои хотелки на примере, ТОЧНО. Скажем, ввели поисковая фразу 'дом кота'. Что в этом случае хотите искать в текстах продуктов? Из того сумбура, что пишете, можно предположить: В1. Искать текст 'домкота' (удален пробел). В результате ничего не найдется! В2. Искать товары, у которых встречаются ВСЕ из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а', (каждый символ отдельно). Найдется много чего, но со смыслом поиска связи никакой. В3. Искать товары, у которых встречаются хотя бы один из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а'. Результат - будет найдены почти все товары. Толку никакого... Quote Link to post Share on other sites
Dmitry86 Posted May 8, 2022 Report Share Posted May 8, 2022 (edited) В 02.12.2021 в 09:47, phukortsin сказал: Бессмыслица. Поиск ищет не буквы, а ТОВАРЫ по соответствию текстов в поисковой фразе. Например, ввели поисковую строку 'мар', ей соответствуют товары, у которых в текстах (названия, меты, что-то другое) встречается 'марля' или 'мармелад' или 'амарант'. Уже сказано - пробуйте объяснить свои хотелки на примере, ТОЧНО. Скажем, ввели поисковая фразу 'дом кота'. Что в этом случае хотите искать в текстах продуктов? Из того сумбура, что пишете, можно предположить: В1. Искать текст 'домкота' (удален пробел). В результате ничего не найдется! В2. Искать товары, у которых встречаются ВСЕ из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а', (каждый символ отдельно). Найдется много чего, но со смыслом поиска связи никакой. В3. Искать товары, у которых встречаются хотя бы один из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а'. Результат - будет найдены почти все товары. Толку никакого... Если говорить о "живом" поиске. По мере набора текста, когда появляются выпадающие предложения. Беру ваш пример: товар называется 'дом кота'. Пользователь набирает: 'домкота' или 'дом-кота', ему предлагается перейти в товар 'дом кота'. Соответсвенно вариации могут быть разные, например, товар называется 'дом-кота'. Пользователь может набирать 'дом кота' или 'домкота', то ему нужно показать 'дом кота'. Edited May 8, 2022 by Dmitry86 Quote Link to post Share on other sites
phukortsin Posted May 9, 2022 Report Share Posted May 9, 2022 Видимо, так: Фразы 'дом кота ул зеленая 78' 'дом кота ул зеленая,78' 'дом кота ул. зеленая, 78' 'дом-кота ул. зеленая, 78' 'домкота:ул:зеленая:78' Должны давать одинаковый результат. Для этого 1. Сначала из фразы удалять все не алфавитно-цифровые символы, получится 'домкотаулзеленая78' 2. Потом фразу разбивать на слова разными способами, например 'дом котаулзеленая78' 'домкотаулзеленая 78' 'домкотаулзел еная78' 'домко таулзеленая78' 'до мк отау лзеле на я78' 3. По каждому способу проводить поиск и результаты объединять. Практически довольно сложно, и заранее неизвестно, какой выйдет результат. Например, если не ограничивать способы в п.2, то число вариантов разбиения с ростом длины быстро вырастет до тысяч и даже миллионов-миллиардов, и никаких ресурсов не хватит. Если требовать длину слов в разбиении, скажем, не менее 3, то в указанном примере никогда не будет искаться '78', а будет искаться 'я78', 'ая78', 'ная78' и т.д. В результате ничего не найдется. То есть сложностей масса уже на этапе планирования... Quote Link to post Share on other sites
Kosjak76 Posted May 9, 2022 Report Share Posted May 9, 2022 Если заменить символы сразу пробелами? Проблем будет в разы меньше Quote Link to post Share on other sites
phukortsin Posted May 9, 2022 Report Share Posted May 9, 2022 5 часов назад, Kosjak76 сказал: Если заменить символы сразу пробелами? Проблем будет в разы меньше Проблем, конечно, меньше. Но это не будет работать так, как требуется. В заявке, в частности, сказано 15 часов назад, Dmitry86 сказал: Пользователь набирает: 'домкота' или 'дом-кота', ему предлагается перейти в товар 'дом кота'. то есть слова при поиске могут быть слиты вместе и нужно угадать границы слов... Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.