Меню Закрыть

B search content stem

Содержание

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

Для всех кто хотел облегчить жизнь с поиском. Было это в далеком ноябре 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-скрипта составляет почти семь тысяч строк. Сходу в таком количестве кода, даже хорошо написанного (к сожалению, битрикс этим не балует), соблюдая паттерны программирования, будет непросто.

Читайте также:  Принтер струйный epson l1300

В этой заметке я покажу способ, как можно кастомизировать основной скрипт логики шаблона оформления заказа (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

В каждом инфоблоке есть настройки "Индексировать элементы для модуля поиска" вот если вам нужно что бы данные из конкретного инфоблока участвовали в поиске ее нужно включить.
Далее когда настроите инфоблоки нужно зайти в Настройки — Поиск — Переиндексация и сделать полную переиндексацию, после этого эти таблицы должны заполниться.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.