то ждем ваше обращение в нашей службе тех поддержки.
Фильтрация
Цитатник веб-разработчиков. Nikolay Ryzhonin: Все-таки более правильный и эффективный путь - это анализ с explain медленных запросов и анализ кода, их вызвавшего. А уже по результатам - добавление необходимых индексов или изменение кода приложения. Так как не всегда медленные запросы - следствие проблем в API, часто встречаются случаи его неправильного использования. |
Кеширование иногда - это зло. Если кешировать каталог с многовариативным фильтром при большой посещаемости, то генерация кеша может превышать 200 мегабайт в минуту. Любая квота на диске заполнится достаточно быстро. Возникают и проблемы с очисткой этого кеша. Отключение такого кеша снизит количество операций на запись.
Не надо бояться создавать индексы. Хотя точно сказать какие индексы создавать в каждой конкретной ситуации заочно нельзя, надо всегда рассматривать конкретную ситуацию. В этом помогает инструмент Индексы.
Один из часто используемых индексов - индекс по списочному свойству. Это индекс для простых инфоблоков. b_iblock_element_property - в этой таблице хранятся значения свойств. Её и индексируем: значение свойства, его ID, ID элемента. Создание такого индекса при фильтре по списковому свойству фактически исключает обращение MySQL к указанной таблице, так как все имеющиеся в запросе поля присутствуют в индексе.
Индексы нужны для конкретных выборок на конкретных проектах. В зависимости от архитектуры и логики проекта медленные запросы получаются свои, и для них нужны свои индексы, часто составные.
Совет от веб-разработчиков. Антон Долганин: Если требуется обновить большое количество элементов, то имеет смысл обновление производить в обход индексации поиском: $el->Update($arEls['ID'], array('PREVIEW_TEXT' => $preview, 'DETAIL_TEXT' => $detail), false, false);4-й параметр в false. А уже после обработки запустить переиндексацию инфоблоков сайта. Запись в модуль поиска увеличивает конечное время исполнения в десятки-сотни раз. |
Типы фильтрации
В большинстве функций и методов модуля информационных блоков, выбирающих списки, в фильтрах возможно использование различных типов фильтрации. Символы типов фильтрации указываются непосредственно перед названием фильтруемого поля.
Типы:
- (пустой) - для строковых полей означает поиск по маске (в маске: "%" - произвольное число любых символов, "_" - один произвольный символ), для полей с нестроковыми типами поиск "равно".
<? // найти элементы у которых название начинается на "#" $res = CIBlockElement::GetList(Array(), Array("NAME"=>"#%")); // найти элементы с идентификатором 100 $res = CIBlockElement::GetList(Array(), Array("ID"=>"100")); ?>
- "!" - для строк выражение не попадающее под маску, или не равно (для остальных типов полей).
<? // найти элементы у которых название не начинается на "#" $res = CIBlockElement::GetList(Array(), Array("!NAME"=>"#%")); ?>
- "?" - с применением логики, работает только для строковых свойств.
<? // найти элементы у которых название содержит "One" или "Two" $res = CIBlockElement::GetList(Array(), Array("?NAME"=>"One | Two")); ?>
- "<" - меньше;
- "<=" - меньше либо равно;
- ">" - больше;
- ">=" - больше либо равно.
<? // найти элементы у которых название начинается на "A" $res = CIBlockElement::GetList(Array(), Array(">=NAME"=>"A", "<NAME"=>"B")); // найти элементы с идентификатором большим 100 $res = CIBlockElement::GetList(Array(), Array(">ID"=>"100")); ?>
- "=" - равно;
- "!=" - не равно.
<? // найти элементы у которых название равно "ELEMENT%1" $res = CIBlockElement::GetList(Array(), Array("=NAME"=>"ELEMENT%1")); ?>
- "%" - подстрока;
- "!%" - не подстрока.
<? // найти элементы у которых в названии есть символ процента "%" $res = CIBlockElement::GetList(Array(), Array("%NAME"=>"%")); ?>
- "><" - между;
- "!><" - не между.
В качестве аргумента данные типы фильтров принимают массив вида Array("значение ОТ", "значение ДО")
.
Указанные операторы отображаются в sql BETWEEN, то есть граничные значения попадают в результат, используется выражение (min .
<? // найти элементы у которых название начинается между "A" и "B" или между "D" и "E" $res = CIBlockElement::GetList(Array(), Array("><NAME"=>Array(Array("A", "B"), Array("D", "E")))); // найти элементы, у которых дата начала активности не в периоде 2003 года $res = CIBlockElement::GetList(Array(), Array("!><DATE_ACTIVE_FROM"=> Array(date($DB->DateFormatToPHP(CLang::GetDateFormat("FULL")), mktime(0,0,0,1,1,2003)), date($DB->DateFormatToPHP(CLang::GetDateFormat("FULL")), mktime(0,0,0,1,1,2004)-1)))); ?>
Несколько частных случаев фильтрации
$arFilter = array("PROPERTY_CML2_SCAN_CODE"=>false ) - используется, чтобы выбрать все элементы с незаполненным свойством; $arFilter = array("PROPERTY_CML2_SCAN_CODE"=>"" ) - используется, чтобы выбрать все элементы; $arFilter = array("PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется точное совпадение свойства с заданной строкой; $arFilter = array("?PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется наличие заданной подстроки в свойстве. $arFilter = array("!PROPERTY_CML2_SCAN_CODE"=>false ) - используется, чтобы выбрать только элементы с заполненным свойством; $arFilter = array("!PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется отсутствие точного совпадения с заданной строкой ; $arFilter = array("!?PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется отсутствие заданной подстроки в свойстве.
Настройка фильтрации для отображения связанных элементов
Задача: допустим, что есть 2 инфоблока, связанные между собой по одному из свойств. Как настроить фильтрацию, чтобы среди элементов ифоблока показывались только связанные?
Решение:
<? $arrFilter = array(); $arrFilter['!PROPERTY_<код свойства>'] = false; ?>
Настройка фильтрации по свойству типа "Дата/время"
Свойство типа "Дата/время" хранится как строковое в формате YYYY-MM-DD HH:MI:SS, поэтому значение для фильтрации формируется следующим образом:
$cat_filter[">"."PROPERTY_available"] = date("Y-m-d");
Список ссылок по теме.
- Основные функции, в которых можно использовать описанную фильтрацию:
- Типы фильтров
Назад в раздел