Содержание
Идея сайта изначально заключалась в написание программы для отправки смс, но щас нет времени, чтобы заниматся этим вопросом, но проект не умер, просто временно заморожен.
Так же Вы можете почитать мои уроки по программированию и некоторую интересующую Вас инфу и другие вкусности.
Для всех кто хотел облегчить жизнь с поиском. Было это в далеком ноябре 2012 🙂 Я сидел и думал почему при поиске по морфологии мой поиск ищет только 50% результатов. И нашел ребята я сделал это, о да…
Дело в том, что если вы обновляете cms с ранних версий поиск не меняет таблицы и продолжает отрабатывать по старой логике заложенной еще в древней версии, предположительно хрен знает какой. 🙂
И однажды приходит клиент, который говорит, ребята беда не ищет… И вы начинаете искать решение, а в итоге ни фига перекапывать 500 строк кода поиска и разбираться в запросах битрикса становиться все тошнотней.
И что же делать думаете вы, забить… писать свой или просто фиг с ним продолжить жить дальше с таким… Гуглите не находите ответа и опечаленные пишете в поддержку, но та отвечает в течение 3 дней и как всегда, давайте доступы будем разбираться. Обновите до последней версии… А сайт уже работает и не известно что слетит при обновлении…
Да-к вот решение: Обновляем поиск до версии 2 вручную:
1) в dbconnect.php
добавляете строку define(«BX_SEARCH_VERSION», 2);
2) Дальше ползете в бекофис на вкладку Настройки ->Инструменты->SQL-запрос
и выполняете следующие команды:
CREATE TABLE b_search_content_text
(
SEARCH_CONTENT_ID INT(11) NOT NULL,
SEARCH_CONTENT_MD5 CHAR(32) NOT NULL,
SEARCHABLE_CONTENT LONGTEXT,
PRIMARY KEY PK_B_SEARCH_CONTENT_TEXT (SEARCH_CONTENT_ID)
);
CREATE TABLE b_search_stem
(
ID INT(11) NOT NULL auto_increment,
STEM VARCHAR(50) BINARY NOT NULL,
PRIMARY KEY PK_B_SEARCH_STEM (ID),
UNIQUE KEY UX_B_SEARCH_STEM (STEM)
);
ALTER TABLE b_search_content_stem ADD PS FLOAT NOT NULL;
ALTER TABLE b_search_content MODIFY USER_ID INT(11);
3) Делаете переиндексацию и вуаля поиск ищет просто великолепно.
Всем хорошего настроения. Век живи век учись 🙂
Наверняка, многие знают, что в битриксе есть морфологический поиск. И вроде бы он даже худо-бедно работает. Но если мы торгуем товарами, и хотим, чтобы поиск искал и по части чего-то специфического, например, артикула товара (пример: артикул «Р6543», подстрокой будет «6543»), то ничего из этого не выйдет. Поиск тупо ничего не найдёт.
В этой заметке покажу способ, как можно эту проблему решить.
В момент индексации элемента будем добавлять в таблицу b_search_content_stem наши части слов. То есть, в нашем случае, для товара с артикулом «Р6543» мы добавим «6543» в поисковый индекс. Запросы «654» и «65» так же будут отдавать товар с артикулом «Р6543».
Обработчики — наше всё
Как обычно, решать мы будем обработчиками. Оффтоп: иногда вижу проекты вообще без файлов init.php и своих кастомных модулей. Ребята, как вам удаётся без этого сайты собирать?
Будем слушать 3 события: BeforeIndex, OnBeforeIndexUpdate и OnAfterIndexAdd.
- BeforeIndex — вызывается перед индексацией элемента методом CSearch::Index()
- OnBeforeIndexUpdate — вызывается перед обновлением поискового индекса
- OnAfterIndexAdd — вызывается после добавления новых данных в поисковый индекс.
На событие BeforeIndex мы проверим, что в индекс летит нужная нам запись и сохраним в статическую переменную данные, которые нам понадобятся в последующих событиях. По другому их там не достать.
На события OnBeforeIndexUpdate и OnAfterIndexAdd запишем в таблицу b_search_content_stem то, что нам нужно. API для этого нет, так что будем писать чистые SQL-запросы. Проверял на MySQL с InnoDB таблицей. На остальных не факт, что будет корректно работать
Код обработчика
Сохраняем код в файле /local/php_interface/classes/handlers/search/stemming.php
В свойстве $allowedIblockId класса необходимо указать ID инфоблоков, для которых нужен функционал.
Регистрируем обработчики и добавляем класс в автозагрузку
Добавить в /local/php_interface/init.php
На этом всё. Осталось только запустить полную переиндексацию и теперь можно не тратить жизнь на вписывание в поиск артикулов полностью.
Для своих частных случаев код придётся, конечно, поправить под себя.
Похожие записи
1С-Битрикс. LazyLoad или ленивая загрузка контента при включенном кешировании
В этой заметке я хочу рассказать о технологии LazyLoad или в простонародье «ленивая загрузка» в Битриксе. Метод, описанный мной, будет точно работать в компонентах catalog.section и news.list.
1C-Битрикс. Кастомизация нового шаблона компонента sale.order.ajax
С выходом нового шаблона компонента sale.order.ajax на форумах битрикса разгораются возмущения и недомения. Мол, теперь код всего шаблона на JavaScript и как его кастомизировать непонятно. На самом деле да, код js-скрипта составляет почти семь тысяч строк. Сходу в таком количестве кода, даже хорошо написанного (к сожалению, битрикс этим не балует), соблюдая паттерны программирования, будет непросто.
В этой заметке я покажу способ, как можно кастомизировать основной скрипт логики шаблона оформления заказа (order_ajax.js), не прибегая к его правке. Что нам это даёт? Когда прилетят очередные обновления шаблона, мы просто заменим его и всё. Все наши кастомизации будут работать (в теории).
1С-Битрикс. Защита от спама в регистрации без капчи
Не редкость, когда боты начинают регистрироваться на сайтах и захламлять списки пользователей своим присутствием. В «1С-Битрикс» можно включить капчу для защиты от спама. Но порой и капча не спасает, да и заставлять пользователей вводить код с капчи, я считаю, не гуманно. Воспользуемся другим трюком.
22 комментария
Пытаюсь воспользоваться описанным решением проблемы морфологического поиска. При запуске переиндексации она просто зависает. Подскажите, с чем это может быть связано? может быть, я не так понял, где нужно указывать >
Александр, что значит зависает?
Смотрите логи ошибок веб-сервера.
После добавления файла Добавить в /local/php_interface/init.php
сайт выпадает в белый экран.
Смотреть логи ошибок веб-сервера.
Указал собственный инфоблок (вместо 1) и вместо [‘ARTICLE’] собственный код артикула. Переиндексировал.
Результата нет — по части артикула не ищет. Может еще что-то изменить?
Напишите через обратную связь на странице «Контакты» — посмотрим.
А почему написано Запросы «653» и «65» так же будут отдавать товар с артикулом «Р6543»
Да, опечатка. Спасибо, поправил.
Вот такой артикул J001.DР.ЕR.20.91.CC.
сам битрикс например J001 находит, а короче — уже нет. Какая тут регулярка нужна , не могу понять.
Что-то вроде: "найти каждый набор символов равный или длиннее 2"? Или какой?
Возможно будет достаточно разбить по точке и оставить части, у которых длина больше 2.
не , по точке битрикс сам разбивает.
но у него кажется лимит — ищет только если в сроке 4 знака (точки не учитывает).
долго вы регулярки изучали? чтобы разобраться в них — сколько времени надо.
и да, про эксперименты — ну а как понять, каждый раз переиндексацию делать?
чем пользуетесь для отладки регулярок?
долго вы регулярки изучали? чтобы разобраться в них — сколько времени надо.
Сколько бы не изучал, иногда всё равно приходиться лезть в документацию
и да, про эксперименты — ну а как понять, каждый раз переиндексацию делать?
скорее всего (но не факт)
чем пользуетесь для отладки регулярок?
Обычно прямо в процессе и отлаживаю. В закладках есть http://regexr.com/
А вообще странная на сайте с которым я вожусь ситуация: по части артикула ищет, но только если это от 4 знаков, причем точки не учитываются. Т.е. как будто уже сделана настройка поиска по части, но сделан какой-то лимит на количество. Это вообще обычная ситуация для битрикса или нет? Большой у вас опыт в этом деле? А то сверху придумвать еще какой-то функционал, если это уже реализовано — как то неправильно. Как будто квест разгадываешь.
Похоже на то, что ваша регулярка не работает
Т.е. как будто уже сделана настройка поиска по части, но сделан какой-то лимит на количество. Это вообще обычная ситуация для битрикса или нет?
Поиск по части слова с морфологией есть, но он не всегда хорошо работает. Собственно, про то как можно это ситуацию подправить для себя и написана заметка.
Похоже на то, что ваша регулярка не работает
запустил на опенсервер — скрипт один результаты разные
У меня такие же результаты, как у вас на последнем скриншоте.
Существует ли исчерпывающий список того, что нужно поправить. Т.е. понятно, что поле артикула [‘PROPERTIES’][‘ARTICLE’][‘VALUE’]
Может что-то еще?
Для своих частных случаев код придётся, конечно, поправить под себя.
Только самое первое условие тут OlegproClassesHandlersSearch::beforeIndexUpdate
Потестировал на локалном — работает, кроме этой части: "Запросы «654» и «65» так же будут отдавать товар с артикулом «Р6543».
непонятно, а за счет чего так должно работать? Это в битриксе настраивается?
и что надо сделать, чтобы данные таблицы заполнились? используется поиск на сфинксе.(галочки "При ранжировании результатов учитывать расстояние между словами", "При ранжировании результатов учитывать рейтинг" проставлены)
И за что отвечают данные таблицы?
1 ответ 1
В каждом инфоблоке есть настройки "Индексировать элементы для модуля поиска" вот если вам нужно что бы данные из конкретного инфоблока участвовали в поиске ее нужно включить.
Далее когда настроите инфоблоки нужно зайти в Настройки — Поиск — Переиндексация и сделать полную переиндексацию, после этого эти таблицы должны заполниться.