Jump to content

Recommended Posts

Доброго

 

Нужно чтобы поиск работал по названиям товара и не отсекал спецсимволы (слеши и ковычки) и искал если даже в названии товара они присутствуют. Да это не безопасно, но не моя воля.

 

Сейчас при вводе в поиск он заканчивает искать при вводе спецсимвола. Как вырезать?

 

Файл в 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

 

 

Спасибо за ответ.

 

 

 


 


 

Link to post
Share on other sites
  • 1 year later...

Добрый день! Подскажите, как сделать, чтобы в поиске не учитывались пробел(ы) и тире?

Например, есть товар, в котором сдержится название модели AB 30 с пробелом. Если в поиске забивать AB30 без пробела, то он не показывает этот товар сразу. То есть чтобы найти нужные товары нужно задать поиск именно с пробелом.

И обратная ситуация, когда в названии товара может быть указано AB30 без пробела, а пользователь скопировал с другого сайта с пробелом и пытается найти этот товар. Получается он вставил в строку поиска или набрал руками AB 30 и не находит товар, хотя он есть.

Аналогично с тире.

В api\Request.php у меня выглядит так:

return strval(preg_replace('/[^\p{L}\p{Nd}\d\@\s_\-\.\%\s]/ui', '', $val));

 

Edited by Dmitry86
Link to post
Share on other sites
1 час назад, Dmitry86 сказал:

Подскажите, как сделать, чтобы в поиске не учитывались пробел(ы) и тире?

Зависит от того, как понимать "не учитывались".

Простейший вариант - при обработке поисковой фразы удаляйте все пробелы и тире. Но это вряд ли даст тот результат, который хотите.

Простыми средствами устранить недостатки, описанные в примерах, практически невозможно. Если пользователь ввел abcdefgh, то понять, что он имел в виду  и что искать - 'abc defgh' или 'ab cdefgh'. А если длинное слитное слово разбивать на несколько частей, то вариантов  будут тысячи...

Link to post
Share on other sites
10 минут назад, phukortsin сказал:

Зависит от того, как понимать "не учитывались".

Простейший вариант - при обработке поисковой фразы удаляйте все пробелы и тире. Но это вряд ли даст тот результат, который хотите.

Простыми средствами устранить недостатки, описанные в примерах, практически невозможно. Если пользователь ввел abcdefgh, то понять, что он имел в виду  и что искать - 'abc defgh' или 'ab cdefgh'. А если длинное слитное слово разбивать на несколько частей, то вариантов  будут тысячи...

Благодарю за ответ. Тут чисто технически, скорее всего, проще убирать все пробелы из названия товара при выборке и из строки поиска, и потом сравнивать их. Разве в этом случае я не получу желаемый результат? Независимо от того, что введет пользователь в строку поиска, с пробелом или без, нужно ему показать тот товар, у которого в названии есть вхождение искомого запроса с пробелами или без оных.

Не важно, что имел ввиду пользователь, важно, чтобы набор этих символов был найден в названии товара, ведь 'abc defgh' и 'ab cdefgh', ведь, с точки зрения машины, будет  = abcdefgh, если в названии товара убрать все пробелы, соотвественно товар будет показан пользователю как найденный.

Делать гугл тут не надо, конечно. Поиск настолько примитивный, что он даже не найдет товар 'AB 30', если набрать '30 AB', но вот с пробелами решить хотелось бы. Иногда  наблюдаю в Вебвизоре, как люди не находят желаемое и уходят с сайта только из-за того, что они не поставили пробел или наоборот поставили пробел в запросе в строке поиска.

 

Может быть есть какие-то другие решения, кроме очистки от пробелов и тире каждого названия товара и поискового запроса пользователя..

Link to post
Share on other sites
В 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' - по границе буквенной части и цифровой части. Надо пробовать конкретно на Вашем сайте с Вашим специфичными товарами, сразу в общем виде вряд ли решение кто даст...

Link to post
Share on other sites
В 27.11.2021 в 09:23, phukortsin сказал:

Вы имеете в виду "живой" поиск

Видимо его я имею ввиду, потому что интересует именно та часть, когда при вводе в строку поиска выпадают предложения с найденным товарами. Если я правильно понимаю, то эта часть относится к JS. В живом поиске можно не учитывать вводимые пробелы? То есть, независимо от того, как указано в названии товара, допустим 'AB30' или 'AB 30' или 'A B-30', то его можно найти даже указав с пробелами, без тире, или с тире в другом месте, например: 'AB 30' или 'A B30', или хоть 'A B-3 0'.

Link to post
Share on other sites

Весьма общие и сложные вопросы ставите. Попробуйте сначала на человеческом языке объяснить то, что хотите, с примерами, учитывающими все тонкости. И надо хоть немного понимать, как работает текстовый поиск, и учитывать это в постановке задачи.

Link to post
Share on other sites
3 часа назад, phukortsin сказал:

Весьма общие и сложные вопросы ставите. Попробуйте сначала на человеческом языке объяснить то, что хотите, с примерами, учитывающими все тонкости. И надо хоть немного понимать, как работает текстовый поиск, и учитывать это в постановке задачи.

Извините, не знаю, как ещё объяснить... ? Вроде, с примерами написал, что хотел бы увидеть.. Давайте по-другому попробую: живой поиск должен искать только буквы и цифры при наборе текста в строке поиска. Вводимые пользователем символы "пробел" и "тире" он должен игнорировать.

Link to post
Share on other sites

 

21 час назад, Dmitry86 сказал:

живой поиск должен искать только буквы и цифры

Бессмыслица. Поиск ищет не буквы, а ТОВАРЫ по соответствию текстов в поисковой фразе. Например, ввели поисковую строку 'мар', ей соответствуют товары, у которых в текстах (названия, меты, что-то другое) встречается 'марля' или 'мармелад' или 'амарант'.

Уже сказано - пробуйте объяснить свои хотелки на примере, ТОЧНО. Скажем, ввели поисковая фразу 'дом кота'. Что в этом случае хотите искать в текстах продуктов? Из того сумбура, что пишете, можно предположить:

В1. Искать текст 'домкота' (удален пробел). В результате ничего не найдется!

В2. Искать товары, у которых встречаются ВСЕ из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а', (каждый символ отдельно). Найдется много чего, но со смыслом поиска связи никакой.

В3. Искать товары, у которых встречаются хотя бы один из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а'. Результат - будет найдены почти все товары. Толку никакого...

 

 

 

 

Link to post
Share on other sites
  • 5 months later...
В 02.12.2021 в 09:47, phukortsin сказал:

 

Бессмыслица. Поиск ищет не буквы, а ТОВАРЫ по соответствию текстов в поисковой фразе. Например, ввели поисковую строку 'мар', ей соответствуют товары, у которых в текстах (названия, меты, что-то другое) встречается 'марля' или 'мармелад' или 'амарант'.

Уже сказано - пробуйте объяснить свои хотелки на примере, ТОЧНО. Скажем, ввели поисковая фразу 'дом кота'. Что в этом случае хотите искать в текстах продуктов? Из того сумбура, что пишете, можно предположить:

В1. Искать текст 'домкота' (удален пробел). В результате ничего не найдется!

В2. Искать товары, у которых встречаются ВСЕ из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а', (каждый символ отдельно). Найдется много чего, но со смыслом поиска связи никакой.

В3. Искать товары, у которых встречаются хотя бы один из текстов 'д', 'о', 'м', 'к', 'о', 'т', 'а'. Результат - будет найдены почти все товары. Толку никакого...

 

 

 

 

Если говорить о "живом" поиске. По мере набора текста, когда появляются выпадающие предложения. Беру ваш пример: товар называется 'дом кота'. Пользователь набирает: 'домкота' или 'дом-кота', ему предлагается перейти в товар 'дом кота'. Соответсвенно вариации могут быть разные, например, товар называется 'дом-кота'. Пользователь может набирать 'дом кота' или 'домкота', то ему нужно показать 'дом кота'.

Edited by Dmitry86
Link to post
Share on other sites

Видимо, так:

Фразы 
'дом кота ул зеленая 78'
'дом кота ул зеленая,78'
'дом кота ул. зеленая, 78'
'дом-кота ул. зеленая, 78'
'домкота:ул:зеленая:78'
Должны давать одинаковый результат.

Для этого 
1. Сначала из фразы удалять все не алфавитно-цифровые символы, получится 'домкотаулзеленая78'
2. Потом фразу разбивать на слова разными способами, например
'дом котаулзеленая78'
'домкотаулзеленая 78'
'домкотаулзел еная78'
'домко таулзеленая78'
'до мк отау лзеле на я78'
3. По каждому способу проводить поиск и результаты объединять.

Практически довольно сложно, и заранее неизвестно, какой выйдет результат. 
Например, если не ограничивать способы в п.2, то число вариантов разбиения с ростом длины быстро вырастет до тысяч и даже миллионов-миллиардов, и никаких ресурсов не хватит. 
Если требовать длину слов в разбиении, скажем, не менее 3, то в указанном примере никогда не будет искаться '78', а будет искаться 'я78', 'ая78', 'ная78' и т.д. В результате ничего не найдется.
То есть сложностей масса уже на этапе планирования...

Link to post
Share on other sites
5 часов назад, Kosjak76 сказал:

Если заменить символы сразу пробелами?

Проблем будет в разы меньше

Проблем, конечно, меньше.  Но это не будет работать так, как требуется. В заявке, в частности, сказано

15 часов назад, Dmitry86 сказал:

Пользователь набирает: 'домкота' или 'дом-кота', ему предлагается перейти в товар 'дом кота'.

то есть слова при поиске могут быть слиты вместе и нужно угадать границы слов...

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
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.

Loading...
×
×
  • Create New...