Skip to content

Instantly share code, notes, and snippets.

@dermanov-ru
Last active November 15, 2021 08:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dermanov-ru/12c79b4f76b390153ff2d5f8097d5e82 to your computer and use it in GitHub Desktop.
Save dermanov-ru/12c79b4f76b390153ff2d5f8097d5e82 to your computer and use it in GitHub Desktop.
<?php
/**
* Ищет по тексту в инфоблоке.
*
* @param $iblockId int | array - ID инфоблока в котором искать. Может быть массивом.
* @param $query string - поисковый запрос. может содержать специфичные для Sphinx операторы ( * ) - будет передан прямо в Sphinx.
* рекомендуется передавать запрос вида <code>"*" . $searchQuery . "*"</code>
* @param $sectionId int - ID раздела в каталоге, в рамках которого искать
* @return array - список ID найденных элементов
*
* @link статья "Битрикс и Sphinx" https://medium.com/@dermanov.mark/bitrix-and-sphinx-ccd806b68e9f
* @see CSearchSphinx::search()
* @see CSearchSphinx::Escape() - оператор или (|) экранируется в самых недрах :(
* */
function fulltextSearchInIblock ($iblockId, $query, $sectionId = false) {
\Bitrix\Main\Loader::includeModule("search");
$obSearch = new CSearch;
// возможные значения для сортировки по релевантности.
// не имеет значения, если потом список найденных элементов будет сортироваться по названию, цене или еще как-то.
// $aSort = array("CUSTOM_RANK"=>"DESC", "TITLE_RANK"=>"DESC", "RANK"=>"DESC", "DATE_CHANGE"=>"DESC");
$aSort = [];
$filter = array(
'QUERY' => "*" . $query . "*",
// обязательно должен быть указан сайт! иначе получится запрос where site_id='' и ничего не найдется
// сайты должны быть привязаны к иблокам до начала полной переиндексации.
// чаще всего у вас будет либо один сайт, либо все инфоблоки будут к нему точно привязаны.
'SITE_ID' => "s1",
// поиск по другому модулю можно вынести в параметры или в другой метод
'MODULE_ID' => 'iblock',
'PARAM2' => $iblockId
);
// Точно работает начиная с версии битрикса 17.0. В 15.5 еще не работает.
if ($sectionId) {
$filter['PARAMS'] = array('iblock_section' => $sectionId);
}
// ищем с отключенной морфологией - найдется больше результатов
$aParamsEx = array('STEMMING' => false);
$obSearch->Search($filter, $aSort, $aParamsEx);
$itemsId = array();
while ($row = $obSearch->fetch()) {
$itemsId[] = $row["ITEM_ID"];
}
return $itemsId;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment