• Модуль: search
  • Путь к файлу: ~/bitrix/modules/search/classes/mysql/search.php
  • Класс: CSearch
  • Вызов: CSearch::StemIndex
static function StemIndex($arLID, $ID, $sContent)
{
	$DB = CDatabase::GetModuleConnection('search');
	static $CACHE_SITE_LANGS = array();
	$ID = intval($ID);

	$arLang = array();
	if (!is_array($arLID))
		$arLID = array();

	foreach ($arLID as $site => $url)
	{
		if (!array_key_exists($site, $CACHE_SITE_LANGS))
		{
			$db_site_tmp = CSite::GetByID($site);
			if ($ar_site_tmp = $db_site_tmp->Fetch())
				$CACHE_SITE_LANGS[$site] = array(
					"LANGUAGE_ID" => $ar_site_tmp["LANGUAGE_ID"],
					"CHARSET" => $ar_site_tmp["CHARSET"],
					"SERVER_NAME" => $ar_site_tmp["SERVER_NAME"]
				);
			else
				$CACHE_SITE_LANGS[$site] = false;
		}
		if (is_array($CACHE_SITE_LANGS[$site]))
			$arLang[$CACHE_SITE_LANGS[$site]["LANGUAGE_ID"]] = true;
	}

	foreach ($arLang as $lang => $value)
	{
		$sql_lang = $DB->ForSql($lang);

		$arDoc = stemming($sContent, $lang);
		$docLength = array_sum($arDoc);

		if (BX_SEARCH_VERSION > 1)
		{
			$arPos = stemming($sContent, $lang, /*$bIgnoreStopWords*/
				false, /*$bReturnPositions*/
				true);
			CSearch::RegisterStem($arDoc);
		}

		if ($docLength > 0)
		{
			$doc = "";
			$logDocLength = log($docLength < 20? 20: $docLength);
			$strSqlPrefix = "
					insert ignore into b_search_content_stem
					(SEARCH_CONTENT_ID, LANGUAGE_ID, STEM, TF".(BX_SEARCH_VERSION > 1? ",PS": "").")
					values
			";
			$maxValuesLen = 2048;
			$strSqlValues = "";

			if (BX_SEARCH_VERSION > 1)
			{
				foreach ($arDoc as $word => $count)
				{
					$stem_id = CSearch::RegisterStem($word);
					//This is almost impossible, but happens
					if ($stem_id > 0)
						$strSqlValues .= ",n("
							.$ID
							.", '".$sql_lang."'"
							.", ".CSearch::RegisterStem($word)
							.", ".number_format(log($count + 1) / $logDocLength, 4, ".", "")
							.", ".number_format($arPos[$word] / $count, 4, ".", "")
							.")";

					if (mb_strlen($strSqlValues) > $maxValuesLen)
					{
						$DB->Query($strSqlPrefix.mb_substr($strSqlValues, 2), false, "File: ".__FILE__."
Line: ".__LINE__); $strSqlValues = ""; } } } else { foreach ($arDoc as $word => $count) { $strSqlValues .= ",n(" .$ID .", '".$sql_lang."'" .", '".$DB->ForSQL($word)."'" .", ".number_format(log($count + 1) / $logDocLength, 4, ".", "") .")"; if (mb_strlen($strSqlValues) > $maxValuesLen) { $DB->Query($strSqlPrefix.mb_substr($strSqlValues, 2), false, "File: ".__FILE__."
Line: ".__LINE__); $strSqlValues = ""; } } } if ($strSqlValues <> '') { $DB->Query($strSqlPrefix.mb_substr($strSqlValues, 2), false, "File: ".__FILE__."
Line: ".__LINE__); $strSqlValues = ""; } } } }