Last active
November 15, 2021 08:19
-
-
Save dermanov-ru/12c79b4f76b390153ff2d5f8097d5e82 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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