Нестандартный поиск по сайту


Разработка сайта для клиента это всегда индивидуальный подход к задаче. Нет двух похожих сайтов, с точки зрения внутренней их структуры и способов отдачи информации. Этот небольшой кейс о том, как была решена не совсем стандартная задача по осуществлению поиска на сайте, посвященном обслуживанию и продаже запчастей на авто марки Land Rover. Специфика сайта будет понятна каждому, кто хоть раз сталкивался с поиском запчастей и аксессуаров для автомобиля. Если нужно заменить запчасть, то наиболее правильным является поиск по артикулу или каталожному номеру. Если же автовладелец решил приобрести аксессуар или футболку с символикой любимого авто, то наиболее вероятно, что поиск он будет осуществлять по обычным словоформам (т.е «футболка»). И если название запчасти известно, а каталожный номер нет, то снова придется обратиться к морфологическому поиску.
Уточним детали: сайт создан на CMS Битрикс, которая имеет хороший внутренний механизм, способный осуществлять поиск, как с учетом морфологии, так и без нее. Вроде бы все достаточно прозрачно на первый взгляд. Однако, по факту оказывается, что CMS Битрикс не может корректно одновременно искать и по артикулу и по словоформам. Более того, исследование других систем поиска (Shpinx, Яндекс, Google), а также консультация со специалистами техподдержки Битрикс, принесли неутешительный результат: стандартный поиск с учетом всех особенностей сайта не даст корректного результата – либо выдача будет меньше необходимого (то есть результат будет низведен до точного вхождения поисковой фразы в тело страницы), либо не будет реализована морфология. Чтобы найти правильное и красивое решение этой задачи, прежде всего, нужно было проанализировать как сформированы артикула на сайте. Хорошим знаком было то, что эта система действительно есть. То есть, каждый артикул, оказалось, возможно описать как некую структуру, состоящую из букв, цифр и символов подчеркивания. 
Поэтому было решено, что задачу можно решить путем создания компонента поиска, в механизме которого будет реализована следующая схема: если в поисковую строку введен артикул, то поиск будет осуществляться без учета морфологии; если же артикула в поисковой строке нет, то будет использован поиск с учетом морфологии. За поиск с учетом морфологии в Битрикс отвечает $exFILTER["STEMMING"]. Если этот параметр находится в состоянии true, поиск осуществляется с учетом морфологии. Следовательно, если артикул, например, состоит из 2-3 букв и 6-7 цифр, следующих за ними, то примерное регулярное выражение preg_match("/^(.*[a-zA-Z]{2,3}\\d+)$/", $q) позволит нам определить содержимое строки поиска и поставить параметр STEMMING в false.