Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Фильтр со сложной логикой

00 голосов
7
Здравствуйте! Хочу с помощь фильтра организовать поиск слова целиком... Вот код фильтра
$arrFilter=array(
"IBLOCK_ID" => 7,
array(
"LOGIC" => "OR",
"?NAME" => "land. || land! || land? || land, || land;",
"?DETAIL_TEXT" => "land. || land! || land? || land, || land;",
),
);
Вопрос: Как мне в этом выражении использовать пробел, если я пишу: "?NAME" => "land. || land! || land? || land, || land; || land " - он воспринимает последнюю запись как просто "land", а не "land "? Может нужно экранирование использовать или код пробела? Заранее Спасибо.
спросил 06 Июнь, 13 от TeoRex (280 баллов)

7 Ответы

00 голосов
А модулем поиска для этой задачи не хотите воспользоваться?
ответил 06 Июнь, 13 от Delp (7,220 баллов)
00 голосов
Модуль поиска не может осуществлять поиск в подразделах. Он только ограничивается инфоблоком. Но я впринципе нашел решение:
$arrSearch = array(
0 => $_GET['search']." ",
1 => $_GET['search'].".",
2 => $_GET['search'].";",
3 => $_GET['search'].",",
4 => $_GET['search']."?",
5 => $_GET['search']."!",
6 => $_GET['search'].":",
7 => $_GET['search']."-"
);

$arrFilter=array(
"IBLOCK_ID" => 7,
"SECTION_CODE" => $arr["path"],
array(
"LOGIC" => "OR",
"%NAME" => $arrSearch,
"%DETAIL_TEXT" => $arrSearch,
),
);
И все работает))) Спасибо за отклик)
ответил 15 Июнь, 13 от TeoRex (280 баллов)
00 голосов
И вам нужно искать элемент со словом, после которого стоят именно привденные вами символы (".", ";", "," и т.д.)?

Если нет, то проще будет такое условие:

$arrFilter=array(
"IBLOCK_ID" => 7,
"SECTION_CODE" => $arr["path"],
array(
"LOGIC" => "OR",
"NAME" => '%'.$_GET['search'].'%',
"DETAIL_TEXT" => '%'.$_GET['search'].'%',
),
ответил 18 Сен, 13 от Delp (7,220 баллов)
00 голосов
Я так понял, что при поиске слова "колба" в результатах не должно быть слова "колбаса", отсюда эти танцы со знаками препинания. Которые не помогут в случае "мышка" - "подмышка".
ответил 16 Дек, 13 от Ly (4,580 баллов)
00 голосов
И не будут работать, если искомое слово стоит в самом конце поля NAME, а в некоторых случаях и в DETAIL_TEXT.
ответил 31 Март, 14 от Ly (4,580 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
Я так понял, что при поиске слова "колба" в результатах не должно быть слова "колбаса", отсюда эти танцы со знаками препинания. Которые не помогут в случае "мышка" - "подмышка".


Именно так. В конце поля, если нет знаков согласен, что работать не будет - но у меня предложения заканчиваются точками. Насчет второго вариата, эти выражения, походу, должны искать сначала слова - это я где то в документации встречал, по-моему. Есть какие-нить другие варианты решения данной проблемы?
ответил 24 Июль, 14 от TeoRex (280 баллов)
00 голосов
Цитата
Pavel Sementsov пишет:
Есть какие-нить другие варианты решения данной проблемы?

Использовать возможности модуля поиска:

Если с фильтрацией по секции, то можно пробовать:
Код
// поисковый запрос
$sSearchQuery = 'land';
// ID инфоблока
$iIBlockID = 7;
// ID секций, к которым может принадлежать элемент
$arSections = array(
   1,
   2,
   3
);

$arFilter = array(
   'QUERY' => $sSearchQuery,
   'MODULE_ID' => 'iblock',
   'PARAM2' => $iIBlockID,
);

$arOrder = array(
   'CUSTOM_RANK' => 'DESC', 
   'RANK' => 'DESC'
);

$arFilterExt = array(
   'STEMMING' => true, // морфология включена
);
// дополняем фильтр по секциям
foreach($arSections as $iSectionID) {
   $arFilterExt[] = array(
      'URL' => '%IBLOCK_SECTION_ID='.$iSectionID.'%'
   );
}

$obSearch = new CSearch();
$obSearch->Search($arFilter, $arOrder, $arFilterExt);
while($arItem = $obSearch->GetNext()) {
   echo '<pre>'.print_r($arItem, true).'</pre>';
}


При таком способе необходимо учитывать, что элемент может принадлежать нескольким секциям, а в шаблоне пути участвует только один. Если такой способ связи используется, то будут "промахи". Тогда от фильтрации по ID секции при поиске нужно избавляться, получать все возможные элементы и уже фильтровать по полученному списку ID элементов выборку из инфоблока, дополнив фильтром по секции.
ответил 25 Ноя, 14 от Delp (7,220 баллов)

Похожие вопросы

0 голосов
0 ответов
спросил 04 Май, 14 от ddvfty (440 баллов)
0 голосов
3 ответов
спросил 02 Авг, 13 от Skarler (280 баллов)
0 голосов
4 ответов
0 голосов
4 ответов
спросил 26 Янв, 14 от Kania (5,180 баллов)