Онлайн-руководство разработчика NetCat
Новогодние скидки до 25%!
Подробнее
Модуль «Поиск по сайту» 12.2.1Начало работы с модулем 12.2.2Язык запросов 12.2.3Способы хранения индекса 12.2.4Интерфейс модуля в панели управления сайтом 12.2.5Области индексирования 12.2.6Области HTML-страниц 12.2.7Области поиска на сайте 12.2.8Индексирование по расписанию, запуск индексирования в фоновом режиме 12.2.9Правила индексирования 12.2.10Постановка задачи переиндексирования в очередь 12.2.11Интеграция модуля в макеты дизайна сайта 12.2.12Простая форма поиска 12.2.13Расширенная форма поиска 12.2.14Вывод результатов поиска 12.2.15Стилизация списка подсказок 12.2.16Расширенные настройки 12.2.17Разработка расширений модуля 12.2.18Обзор архитектуры модуля 12.2.19Обработчики документов различных типов 12.2.20Текстовые фильтры 12.2.21Анализаторы текста 12.2.22Корректировщики запросов 12.2.23Подключение других поисковых систем 12.2.24Решение проблем с поиском 12.2.25Решение проблем с индексированием 12.2.26Справочник API

Области HTML-страниц

Указание областей HTML-страниц, подлежащих индексированию

В панели управления модулем на вкладке «Настройки» — «HTML-документы» можно указать, какие части HTML-страниц будут индексироваться, а значит, будут доступны для поиска.

По умолчанию индексируется содержимое HTML-страниц между комментариями <!-- content --> и <!-- /content -->, а если их нет — всё содержимое тэга body.

Из содержимого будут исключены все части страниц, указанные в поле «Области, содержимое которых не индексируется». По умолчанию это содержимое между комментариями <!-- noindex --> и <!-- /noindex -->, содержимое тэгов script и style.

Вы можете указать собственные области, подлежащие индексированию или исключаемые из него:

  • По имени тэга, например: aside
  • По xpath-запросу, например: //div[@class="menu"]
    (Обратите внимание: значения атрибутов являются регистрозависимыми, поэтому запрос, указанный выше в примере, не будет выбирать содержимое элемента <div class="Menu">.)
  • По регулярному выражению, например: #<!--junk-->(.+?)<!--/junk-->#i
    (Обратите внимание: разделителем регулярного выражения обязательно должен быть символ «#».)

В процессе обработки HTML-страниц они преобразовываются в объект класса DOMDocument (см. http://php.net/domdocument), поэтому их исходный код в момент выполнения xpath-запросов и регулярных выражений может отличаться от полученного с сайта:

  • будут закрыты все тэги;
  • будут удалены лишние закрывающиеся тэги;
  • названия тэгов и атрибутов будут приведены к нижнему регистру;
  • все кавычки будут заменены на двойные;
  • символ «&» будет заменен на «&amp;»;
  • тэги без содержимого не будут иметь закрывающего слеша, например <br /> будет преобразован в <br>;
  • переносы строк и отступы могут быть изменены.

Например, некорректный с точки зрения стандартов фрагмент <div><b>text</div></b> будет преобразован в <div><b>text</b></div>.

В связи с указанными особенностями могут возникать ошибки при индексировании страниц с тэгом <script> с кодом, выводящим тэги </body> и </html>. В случае, когда подобный код необходим, можно разбивать данные тэги: document.write("</" + "body>").

Сохранение частей страниц для использования в результатах поиска

При использовании стандартной службы поиска имеется возможность сохранять фрагменты HTML-страниц в отдельные поля (вкладка «Настройки» — «HTML-документы», блок «Извлечение данных»). Эти фрагменты могут быть получены на странице с результатами поиска из массива $f_meta[имя_поля], использованы для сортировки результатов (например, сортировка товаров по цене или другой характеристике) или для организации простого фасетного поиска (например, поиск по определённому автору). Для выбора фрагментов можно использовать имена тэгов, xpath-запросы и регулярные выражения, аналогично указанию фрагментов, подлежащих индексированию (см. выше).

Каждое поле данных имеет настройки:

  • тип поля: строка или целое число (от 0 до 999.999.999);
  • если поле участвует в поиске, его значение сохраняется в поисковом индексе, и при выполнении поискового запроса будет производиться поиск по данному полю (в том числе, когда перед поисковой фразой имя поля не указано);
  • если установлен параметр «значение доступно в результатах поиска», изначальное значение соответствующего фрагмента HTML-страницы можно получить в результатах поиска;
  • если установлен параметр «нормализовывать текст», будет доступен поиск с учётом морфологии;
  • параметр разрешить сортировку по полю также включает возможность поиска по полю.

Примечание: если для решения вашей задачи не нужен полнотекстовый поиск, следует использовать стандартные механизмы фильтрации результатов NetCat — см. раздел «Поиск и выборка»).

Пример использования:

На странице с выводом полной информации о товаре необходимо добавить разметку для извлечения необходимой информации (в данном случае — цены). Также добавим код, подсказывающий модулю поиска, что это страница с товаром:

<div data-type="goods">
Описание...<br />
Цена: <span class="price">20000</span> руб.<br />
</div>

Добавим информацию о полях на вкладке «Настройки» — «HTML-документы»:

  • Имя поля: page_type,
    Запрос: //div[@data-type]/@data-type (получить значение атрибута data-type тэга div), тип: строка, поле участвует в поиске, недоступно в результатах, не нормализуется, не участвует в сортировке.
  • Имя поля: price,
    Запрос: //span[@class='price'] (получить содержимое тэга span с классом price), тип: целое число, поле участвует в поиске, доступно в результатах, не нормализуется, участвует в сортировке.

После переиндексации страниц с товарами появятся следующие возможности:

  • Выводить цену товара в результатах поиска. В компоненте поиска в поле «Объект в списке» цена будет доступна в массиве $f_meta['price'].
  • Ограничить поиск только товарами (если включена возможность поиска по полю, вкладка «Настройки» — «Общие»). Для этого необходимо модифицировать запрос (например, в системных настройках компонента поиска), дописав к нему page_type:goods.
  • Сортировать результаты по цене (должен быть включен поиск по полю), передав GET-параметр sortby=price при обращении к компоненту поиска (sortdirection=asc — сортировка по возрастанию, sortdirection=desc — по убыванию; по умолчанию результаты сортируются по убыванию).
  • Искать товары по диапазону цен (должен быть включен поиск по интервалу значений), например, для поиска товаров с ценой от 1000 до 5000 нужно дописать к поисковому запросу условие page_type:goods price:[1000 TO 5000].

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

Описание проекта