1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
search.php
См. документацию.
1<?php
2require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/search/classes/general/search.php';
3
4class CSearch extends CAllSearch
5{
6 /*
7 var $arForumTopics = array();
8
9 function DBNavStart()
10 {
11 //total rows count
12 $this->NavRecordCount = mysql_num_rows($this->result);
13 if($this->NavRecordCount < 1)
14 return;
15
16 if($this->NavShowAll)
17 $this->NavPageSize = $this->NavRecordCount;
18
19 //calculate total pages depend on rows count. start with 1
20 $this->NavPageCount = floor($this->NavRecordCount/$this->NavPageSize);
21 if($this->NavRecordCount % $this->NavPageSize > 0)
22 $this->NavPageCount++;
23
24 //page number to display. start with 1
25 $this->NavPageNomer = ($this->PAGEN < 1 || $this->PAGEN > $this->NavPageCount? ($_SESSION[$this->SESS_PAGEN] < 1 || $_SESSION[$this->SESS_PAGEN] > $this->NavPageCount? 1:$_SESSION[$this->SESS_PAGEN]):$this->PAGEN);
26
27 //rows to skip
28 $NavFirstRecordShow = $this->NavPageSize * ($this->NavPageNomer-1);
29 $NavLastRecordShow = $this->NavPageSize;
30
31 if($this->SqlTraceIndex)
32 {
33 list($usec, $sec) = explode(" ", microtime());
34 $start_time = ((float)$usec + (float)$sec);
35 }
36
37 while($NavFirstRecordShow > 0)
38 {
39 if(($res = mysql_fetch_array($this->result, MYSQL_ASSOC)))
40 {
41 if(
42 $res["MODULE_ID"] == "forum"
43 && array_key_exists($res["PARAM2"], $this->arForumTopics)
44 )
45 $this->NavRecordCount--; //eat forum topic duplicates
46 elseif(
47 $res["module"] == "forum"
48 && array_key_exists($res["param2"], $this->arForumTopics)
49 )
50 $this->NavRecordCount--; //eat forum topic duplicates
51 else
52 $NavFirstRecordShow--;
53
54 if($res["MODULE_ID"] == "forum")
55 $this->arForumTopics[$res["PARAM2"]] = true;
56 elseif($res["module"] == "forum")
57 $this->arForumTopics[$res["param2"]] = true;
58 }
59 else
60 {
61 break;
62 }
63 }
64
65 $temp_arrray = array();
66 while($NavLastRecordShow > 0)
67 {
68 if(($res = mysql_fetch_array($this->result, MYSQL_ASSOC)))
69 {
70 if(
71 $res["MODULE_ID"] == "forum"
72 && array_key_exists($res["PARAM2"], $this->arForumTopics)
73 )
74 $this->NavRecordCount--; //eat forum topic duplicates
75 elseif(
76 $res["module"] == "forum"
77 && array_key_exists($res["param2"], $this->arForumTopics)
78 )
79 $this->NavRecordCount--; //eat forum topic duplicates
80 else
81 {
82 if($this->arUserMultyFields)
83 foreach($this->arUserMultyFields as $FIELD_NAME=>$flag)
84 if($res[$FIELD_NAME])
85 $res[$FIELD_NAME] = unserialize($res[$FIELD_NAME]);
86 $temp_arrray[] = $res;
87 $NavLastRecordShow--;
88 }
89
90 if($res["MODULE_ID"] == "forum")
91 $this->arForumTopics[$res["PARAM2"]] = true;
92 elseif($res["module"] == "forum")
93 $this->arForumTopics[$res["param2"]] = true;
94 }
95 else
96 {
97 break;
98 }
99 }
100
101 //Adjust total pages depend on rows count. start with 1
102 $this->NavPageCount = floor($this->NavRecordCount/$this->NavPageSize);
103 if($this->NavRecordCount % $this->NavPageSize > 0)
104 $this->NavPageCount++;
105
106 if($this->SqlTraceIndex)
107 {
108 list($usec, $sec) = explode(" ", microtime());
109 $end_time = ((float)$usec + (float)$sec);
110 $exec_time = round($end_time-$start_time, 10);
111 $GLOBALS["DB"]->arQueryDebug[$this->SqlTraceIndex - 1]["TIME"] += $exec_time;
112 $GLOBALS["DB"]->timeQuery += $exec_time;
113 }
114
115 $this->nSelectedCount = $this->NavRecordCount;
116 $this->arResult = $temp_arrray;
117 }
118 */
119
120 function MakeSQL($query, $strSqlWhere, $strSort, $bIncSites, $bStem)
121 {
122 global $USER;
123 $DB = CDatabase::GetModuleConnection('search');
124 $helper = $DB->getConnection()->getSqlHelper();
125
126 $bDistinct = false;
127 $arSelect = [
128 'ID' => 'sc.ID',
129 'MODULE_ID' => 'sc.MODULE_ID',
130 'ITEM_ID' => 'sc.ITEM_ID',
131 'TITLE' => 'sc.TITLE',
132 'TAGS' => 'sc.TAGS',
133 'PARAM1' => 'sc.PARAM1',
134 'PARAM2' => 'sc.PARAM2',
135 'UPD' => 'sc.UPD',
136 'DATE_FROM' => 'sc.DATE_FROM',
137 'DATE_TO' => 'sc.DATE_TO',
138 'URL' => 'sc.URL',
139 'CUSTOM_RANK' => 'sc.CUSTOM_RANK',
140 'FULL_DATE_CHANGE' => $DB->DateToCharFunction('sc.DATE_CHANGE'),
141 'DATE_CHANGE' => $DB->DateToCharFunction('sc.DATE_CHANGE', 'SHORT'),
142 'DATE_CHANGE_X' => 'sc.DATE_CHANGE',
143 ];
144
145 if ($this->Query->bText)
146 {
147 $arSelect['SEARCHABLE_CONTENT'] = 'sct.SEARCHABLE_CONTENT';
148 }
149 $arSelect['USER_ID'] = 'sc.USER_ID';
150
151
152 if (mb_strpos($strSort, 'TITLE_RANK') !== false)
153 {
154 $strSelect = '';
155 if ($bStem)
156 {
157 foreach ($this->Query->m_stemmed_words as $stem)
158 {
159 if ($strSelect <> '')
160 {
161 $strSelect .= ' + ';
162 }
163 $strSelect .= "case when position('" . $stem . "' in upper(sc.TITLE)) > 0 then 1 else 0 end";
164 }
165 $arSelect['TITLE_RANK'] = $strSelect;
166 }
167 else
168 {
169 foreach ($this->Query->m_words as $word)
170 {
171 if ($strSelect <> '')
172 {
173 $strSelect .= ' + ';
174 }
175 $strSelect .= "case when position('" . $DB->ForSql(mb_strtoupper($word)) . "' in upper(sc.TITLE)) > 0 then 1 else 0 end";
176 }
177 $arSelect['TITLE_RANK'] = $strSelect;
178 }
179 }
180
181 $strStemList = '';
182 if ($bStem)
183 {
184 $strStemList = implode(', ', $this->Query->m_stemmed_words_id);
185 }
186
187 $bWordPos = COption::GetOptionString('search', 'use_word_distance') == 'Y';
188
189 if ($bIncSites && $bStem)
190 {
191 $arSelect['SITE_URL'] = 'scsite.URL';
192 $arSelect['SITE_ID'] = 'scsite.SITE_ID';
193
194 if (!preg_match('/(sc|sct)./', $query))
195 {
196 $strSqlWhere = preg_replace('#AND\\(st.TF >= [0-9\.,]+\\)#i', '', $strSqlWhere);
197
198 if (count($this->Query->m_stemmed_words) > 1)
199 {
200 $arSelect[$helper->quote('RANK')] = 'stt.' . $helper->quote('RANK');
201 }
202 else
203 {
204 $arSelect[$helper->quote('RANK')] = 'stt.TF';
205 }
206
207 $strSql = '
208 FROM b_search_content sc
209 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
210 INNER JOIN b_search_content_site scsite ON sc.ID=scsite.SEARCH_CONTENT_ID
211 ' . (count($this->Query->m_stemmed_words) > 1 ?
212 'INNER JOIN (
213 select search_content_id, max(st.TF) TF, ' . ($bWordPos ? 'case when STDDEV(st.PS)-' . $this->normdev(count($this->Query->m_stemmed_words)) . ' between -0.000001 and 1 then 1/STDDEV(st.PS) else 0 end + ' : '') . "sum(st.TF/sf.FREQ) as " . $helper->quote('RANK') . "
214 from b_search_content_stem st, b_search_content_freq sf
215 where st.language_id = '" . $this->Query->m_lang . "'
216 and st.stem = sf.stem
217 and sf.language_id = st.language_id
218 and st.stem in (" . $strStemList . ')
219 ' . ($this->tf_hwm > 0 ? 'and st.TF >= ' . number_format($this->tf_hwm, 2, '.', '') : '') . '
220 ' . ($this->tf_hwm_site_id <> '' ? "and sf.SITE_ID = '" . $DB->ForSQL($this->tf_hwm_site_id, 2) . "'" : 'and sf.SITE_ID IS NULL') . '
221 group by st.search_content_id
222 having (' . $query . ')
223 ) stt ON sc.id = stt.search_content_id'
224 : 'INNER JOIN b_search_content_stem stt ON sc.id = stt.search_content_id'
225 ) . '
226 WHERE
227 ' . CSearch::CheckPermissions('sc.ID') . '
228 ' . (count($this->Query->m_stemmed_words) > 1 ? '' : "
229 and stt.language_id = '" . $this->Query->m_lang . "'
230 and stt.stem in (" . $strStemList . ')
231 ' . ($this->tf_hwm > 0 ? 'and stt.TF >= ' . number_format($this->tf_hwm, 2, '.', '') : '') . '') . '
232 ' . $strSqlWhere . '
233 ';
234 }
235 else
236 {
237 $arGroupBy = [];
238 foreach ($arSelect as $selectAlias => $selectField)
239 {
240 $arGroupBy[] = $selectField;
241 }
242
243 if (count($this->Query->m_stemmed_words) > 1)
244 {
245 if ($bWordPos)
246 {
247 $arSelect[$helper->quote('RANK')] = 'case when STDDEV(st.PS)-' . $this->normdev(count($this->Query->m_stemmed_words)) . ' between -0.000001 and 1 then 1/STDDEV(st.PS) else 0 end + sum(st.TF/sf.FREQ)';
248 }
249 else
250 {
251 $arSelect[$helper->quote('RANK')] = 'sum(st.TF/sf.FREQ)';
252 }
253 }
254 else
255 {
256 $arSelect[$helper->quote('RANK')] = 'st.TF';
257 }
258
259 $strSql = '
260 FROM b_search_content sc
261 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
262 INNER JOIN b_search_content_site scsite ON sc.ID=scsite.SEARCH_CONTENT_ID
263 INNER JOIN b_search_content_stem st ON sc.id = st.search_content_id+0
264 ' . (count($this->Query->m_stemmed_words) > 1 ?
265 'INNER JOIN b_search_content_freq sf ON
266 st.language_id = sf.language_id
267 and st.stem=sf.stem
268 ' . ($this->tf_hwm_site_id <> '' ?
269 "and sf.SITE_ID = '" . $DB->ForSQL($this->tf_hwm_site_id, 2) . "'" :
270 'and sf.SITE_ID IS NULL'
271 ) :
272 ''
273 ) . '
274 WHERE
275 ' . CSearch::CheckPermissions('sc.ID') . '
276 AND st.STEM in (' . $strStemList . ')
277 ' . (count($this->Query->m_stemmed_words) > 1 ? 'AND sf.STEM in (' . $strStemList . ')' : '') . "
278 AND st.language_id='" . $this->Query->m_lang . "'
279 " . $strSqlWhere . '
280 GROUP BY
281 ' . implode(', ', $arGroupBy) . '
282 HAVING
283 (' . $query . ')
284 ';
285 }
286 }
287 elseif ($bIncSites && !$bStem)
288 {
289 $bDistinct = true;
290
291 $arSelect['SITE_URL'] = 'scsite.URL';
292 $arSelect['SITE_ID'] = 'scsite.SITE_ID';
293 $arSelect[$helper->quote('RANK')] = '1';
294
295 $arGroupBy = [];
296 foreach ($arSelect as $selectAlias => $selectField)
297 {
298 $arGroupBy[] = $selectField;
299 }
300
301 if ($this->Query->bTagsSearch)
302 {
303 $strSql = '
304 FROM b_search_content sc
305 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
306 INNER JOIN b_search_content_site scsite ON sc.ID=scsite.SEARCH_CONTENT_ID
307 INNER JOIN b_search_tags stags ON (sc.ID = stags.SEARCH_CONTENT_ID)
308 WHERE
309 ' . CSearch::CheckPermissions('sc.ID') . '
310 ' . $strSqlWhere . '
311 ' . (is_array($this->Query->m_tags_words) && count($this->Query->m_tags_words) > 0 ? "AND stags.NAME in ('" . implode("','", $this->Query->m_tags_words) . "')" : '') . '
312 GROUP BY
313 ' . implode(', ', $arGroupBy) . '
314 HAVING
315 ' . $query . '
316 ';
317 }
318 else
319 {
320 $strSql = '
321 FROM
322 ' . ($this->Query->bText ? '
323 b_search_content_text sct
324 INNER JOIN b_search_content sc ON sc.ID = sct.SEARCH_CONTENT_ID
325 INNER JOIN b_search_content_site scsite ON sc.ID = scsite.SEARCH_CONTENT_ID
326 ' : '
327 b_search_content sc
328 INNER JOIN b_search_content_site scsite ON sc.ID = scsite.SEARCH_CONTENT_ID
329 ') . '
330 WHERE
331 ' . CSearch::CheckPermissions('sc.ID') . '
332 AND (' . $query . ')
333 ' . $strSqlWhere . '
334 ';
335 }
336 }
337 elseif (!$bIncSites && $bStem)
338 {
339 $arGroupBy = [];
340 foreach ($arSelect as $selectAlias => $selectField)
341 {
342 $arGroupBy[] = $selectField;
343 }
344
345 if (count($this->Query->m_stemmed_words) > 1)
346 {
347 if ($bWordPos)
348 {
349 $arSelect[$helper->quote('RANK')] = 'case when STDDEV(st.PS)-' . $this->normdev(count($this->Query->m_stemmed_words)) . ' between -0.000001 and 1 then 1/STDDEV(st.PS) else 0 end + sum(st.TF/sf.FREQ)';
350 }
351 else
352 {
353 $arSelect[$helper->quote('RANK')] = 'sum(st.TF/sf.FREQ)';
354 }
355 }
356 else
357 {
358 $arSelect[$helper->quote('RANK')] = 'st.TF';
359 }
360
361 $strSql = '
362 FROM b_search_content sc
363 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
364 INNER JOIN b_search_content_stem st ON sc.id = st.search_content_id
365 ' . (count($this->Query->m_stemmed_words) > 1 ?
366 'INNER JOIN b_search_content_freq sf ON
367 st.language_id = sf.language_id
368 and st.stem=sf.stem
369 ' . ($this->tf_hwm_site_id <> '' ?
370 "and sf.SITE_ID = '" . $DB->ForSQL($this->tf_hwm_site_id, 2) . "'" :
371 'and sf.SITE_ID IS NULL'
372 ) :
373 ''
374 ) . '
375 WHERE
376 ' . CSearch::CheckPermissions('sc.ID') . '
377 AND st.STEM in (' . $strStemList . ')
378 ' . (count($this->Query->m_stemmed_words) > 1 ? 'AND sf.STEM in (' . $strStemList . ')' : '') . "
379 AND st.language_id='" . $this->Query->m_lang . "'
380 " . $strSqlWhere . '
381 ' . (count($this->Query->m_stemmed_words) > 1 ? '
382 GROUP BY
383 ' . implode(', ', $arGroupBy) . '
384 HAVING
385 (' . $query . ') ' : '') . '
386 ';
387 }
388 else //if(!$bIncSites && !$bStem)
389 {
390 $bDistinct = true;
391 $arSelect[$helper->quote('RANK')] = '1';
392
393 $arGroupBy = [];
394 foreach ($arSelect as $selectAlias => $selectField)
395 {
396 $arGroupBy[] = $selectField;
397 }
398
399 $strSql = '
400 FROM b_search_content sc
401 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
402 ' . ($this->Query->bTagsSearch ? 'INNER JOIN b_search_tags stags ON (sc.ID = stags.SEARCH_CONTENT_ID)
403 WHERE
404 ' . CSearch::CheckPermissions('sc.ID') . '
405 ' . $strSqlWhere . '
406 ' . (is_array($this->Query->m_tags_words) && count($this->Query->m_tags_words) > 0 ? "AND stags.NAME in ('" . implode("','", $this->Query->m_tags_words) . "')" : '') . '
407 GROUP BY
408 ' . implode(', ', $arGroupBy) . '
409 HAVING
410 (' . $query . ')' :
411 ' WHERE
412 (' . $query . ')
413 ' . $strSqlWhere . '
414 ') . '
415 ';
416 }
417
418 if ($this->offset === false)
419 {
421 }
422 else
423 {
424 $limit = $this->offset . ', ' . $this->limit;
425 }
426
427 $strRatingJoin = '';
428 $RATING_MAX = 0;
429 $RATING_MIN = 0;
430 if (
431 ($this->flagsUseRatingSort & 0x01)
432 && COption::GetOptionString('search', 'use_social_rating') == 'Y'
433 && COption::GetOptionString('search', 'dbnode_id') <= 0
434 )
435 {
436 $rsMinMax = $DB->Query('select max(TOTAL_VALUE) RATING_MAX, min(TOTAL_VALUE) RATING_MIN from b_rating_voting');
437 $arMinMax = $rsMinMax->Fetch();
438 if ($arMinMax)
439 {
440 $RATING_MAX = doubleval($arMinMax['RATING_MAX']);
441 if ($RATING_MAX < 0)
442 {
443 $RATING_MAX = 0;
444 }
445
446 $RATING_MIN = doubleval($arMinMax['RATING_MIN']);
447 if ($RATING_MIN > 0)
448 {
449 $RATING_MIN = 0;
450 }
451 }
452
453 if ($RATING_MAX != 0 || $RATING_MIN != 0)
454 {
455 $arSelectOuter = [];
456 $arSelectOuterFields = [
457 'BODY',
458 ];
459 foreach ($arSelectOuterFields as $outerField)
460 {
461 if (isset($arSelect[$outerField]))
462 {
463 $arSelectOuter[$outerField] = $arSelect[$outerField];
464 }
465 unset($arSelect[$outerField]);
466 }
467
468 $strSelectOuter = 'SELECT sc0.*' . ($arSelectOuter ? ', ' . implode(', ', $arSelectOuter) : '');
469 $strSelectInner = 'SELECT ' . ($bDistinct ? 'DISTINCT' : '') . "\n" . implode("\n,", $arSelect);
470
471 return '
472 ' . $strSelectOuter . ', sc0.' . $helper->quote('RANK') . ' +
473 case when rv.TOTAL_VALUE > 0 then ' . ($RATING_MAX > 0 ? 'rv.TOTAL_VALUE/' . $RATING_MAX : '0') . ' when
474 rv.TOTAL_VALUE < 0 then ' . ($RATING_MIN < 0 ? 'rv.TOTAL_VALUE/' . abs($RATING_MIN) : '0') . ' else
475 0
476 end SRANK
477 ,' . $DB->IsNull('rvv.VALUE', '0') . ' RATING_USER_VOTE_VALUE
478 ,sc.ENTITY_TYPE_ID RATING_TYPE_ID
479 ,sc.ENTITY_ID RATING_ENTITY_ID
480 ,rv.TOTAL_VOTES RATING_TOTAL_VOTES
481 ,rv.TOTAL_POSITIVE_VOTES RATING_TOTAL_POSITIVE_VOTES
482 ,rv.TOTAL_NEGATIVE_VOTES RATING_TOTAL_NEGATIVE_VOTES
483 ,rv.TOTAL_VALUE RATING_TOTAL_VALUE
484 FROM (
485 ' . $strSelectInner . '
486 ' . $strSql . $strSort . "\nLIMIT " . $limit . '
487 ) sc0
488 INNER JOIN b_search_content sc ON sc.ID = sc0.ID
489 LEFT JOIN b_rating_voting rv ON rv.ENTITY_TYPE_ID = sc.ENTITY_TYPE_ID AND rv.ENTITY_ID = sc.ENTITY_ID
490 LEFT JOIN b_rating_vote rvv ON rvv.ENTITY_TYPE_ID = sc.ENTITY_TYPE_ID AND rvv.ENTITY_ID = sc.ENTITY_ID AND rvv.USER_ID = ' . intval($USER->GetId()) . '
491 ' . str_replace(' ' . $helper->quote('RANK'), ' SRANK', $strSort);
492 }
493 }
494
495 $strSelect = '';
496 foreach ($arSelect as $selectAlias => $selectField)
497 {
498 $strSelect .= ($strSelect ? ',' : ' ') . $selectField . ' as ' . $selectAlias . "\n";
499 }
500
501 $strSql = 'SELECT ' . ($bDistinct ? 'DISTINCT' : '') . $strSelect . "\n" . $strSql . $strSort . "\nLIMIT " . $limit;
502
503 return $strSql;
504 }
505
506 function tagsMakeSQL($query, $strSqlWhere, $strSort, $bIncSites, $bStem, $limit = 100)
507 {
508 $DB = CDatabase::GetModuleConnection('search');
509 $limit = intval($limit);
510 if ($bStem && count($this->Query->m_stemmed_words) > 1)
511 {
512 //We have to make some magic in case quotes was used in query
513 //We have to move (sc.searchable_content LIKE '%".ToUpper($word)."%') from $query to $strSqlWhere
514 $arMatches = [];
515 while (preg_match("/(AND\s+\‍([sct]+.searchable_content LIKE \'\%.+?\%\'\‍))/", $query, $arMatches))
516 {
517 $strSqlWhere .= $arMatches[0];
518 $query = str_replace($arMatches[0], '', $query);
519 $arMatches = [];
520 }
521 }
522
523 if ($bStem)
524 {
525 $strStemList = implode(', ', $this->Query->m_stemmed_words_id);
526 }
527
528 if ($bIncSites && $bStem)
529 {
530 $strSql = '
531 SELECT
532 stags.NAME
533 ,COUNT(DISTINCT stags.SEARCH_CONTENT_ID) as CNT
534 ,MAX(sc.DATE_CHANGE) DC_TMP
535 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)') . ' as FULL_DATE_CHANGE
536 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)', 'SHORT') . ' as DATE_CHANGE
537 ' . (count($this->Query->m_stemmed_words) > 1 && mb_strpos($query, 'searchable_content') !== false ? ',sct.SEARCHABLE_CONTENT' : '') . '
538 FROM b_search_tags stags
539 INNER JOIN b_search_content sc ON (stags.SEARCH_CONTENT_ID=sc.ID)
540 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
541 INNER JOIN b_search_content_site scsite ON sc.ID=scsite.SEARCH_CONTENT_ID
542 INNER JOIN b_search_content_stem st ON sc.id = st.search_content_id
543 ' . (count($this->Query->m_stemmed_words) > 1 ?
544 'INNER JOIN b_search_content_freq sf ON
545 st.language_id = sf.language_id
546 and st.stem=sf.stem
547 ' . ($this->tf_hwm_site_id <> '' ?
548 "and sf.SITE_ID = '" . $DB->ForSQL($this->tf_hwm_site_id, 2) . "'" :
549 'and sf.SITE_ID IS NULL'
550 ) :
551 ''
552 ) . '
553 WHERE
554 ' . CSearch::CheckPermissions('sc.ID') . '
555 AND st.STEM in (' . $strStemList . ')
556 ' . (count($this->Query->m_stemmed_words) > 1 ? 'AND sf.STEM in (' . $strStemList . ')' : '') . "
557 AND st.language_id='" . $this->Query->m_lang . "'
558 AND stags.SITE_ID = scsite.SITE_ID
559 " . $strSqlWhere . '
560 GROUP BY
561 stags.NAME
562 ' . ((count($this->Query->m_stemmed_words) > 1) ? '
563 HAVING
564 (' . $query . ') ' : '') . '
565 ' . $strSort . '
566 ';
567 }
568 elseif ($bIncSites && !$bStem)
569 {
570 //Copy first exists into inner join in hopeless try to defeat MySQL optimizer
571 $strSqlJoin2 = '';
572 $match = [];
573 if ($strSqlWhere && preg_match('#\\s*EXISTS \\(SELECT \\* FROM b_search_content_param WHERE (SEARCH_CONTENT_ID = sc\\.ID AND PARAM_NAME = \'[^\']+\' AND PARAM_VALUE(\\s*= \'[^\']+\'|\\s+in \\(\'[^\']+\'\\)))\\)#', $strSqlWhere, $match))
574 {
575 $strSqlJoin2 = 'INNER JOIN b_search_content_param scp ON scp.' . $match[1];
576 }
577
578 if ($query == '1=1')
579 {
580 $strSql = '
581 SELECT
582 stags2.NAME
583 ,COUNT(DISTINCT stags2.SEARCH_CONTENT_ID) as CNT
584 ,MAX(sc.DATE_CHANGE) DC_TMP
585 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)') . ' as FULL_DATE_CHANGE
586 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)', 'SHORT') . ' as DATE_CHANGE
587 FROM b_search_tags stags2
588 INNER JOIN b_search_content sc ON (stags2.SEARCH_CONTENT_ID=sc.ID)
589 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
590 INNER JOIN b_search_content_site scsite ON (sc.ID=scsite.SEARCH_CONTENT_ID AND stags2.SITE_ID=scsite.SITE_ID)
591 ' . $strSqlJoin2 . '
592 WHERE
593 ' . CSearch::CheckPermissions('sc.ID') . '
594 AND ' . ($this->Query->bTagsSearch ? (
595 //Index range scan optimization (make it for other queries ???)
596 is_array($this->Query->m_tags_words) && count($this->Query->m_tags_words) ?
597 "stags.name in ('" . implode("', '", $this->Query->m_tags_words) . "')" :
598 '(1=1)'
599 ) : '(' . $query . ')') . ' ' . $strSqlWhere . '
600 GROUP BY
601 stags2.NAME
602 ' . $strSort . '
603 ';
604 }
605 else
606 {
607 $strSql = '
608 SELECT
609 stags2.NAME
610 ,COUNT(DISTINCT stags.SEARCH_CONTENT_ID) as CNT
611 ,MAX(sc.DATE_CHANGE) DC_TMP
612 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)') . ' as FULL_DATE_CHANGE
613 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)', 'SHORT') . ' as DATE_CHANGE
614 FROM b_search_tags stags2
615 INNER JOIN b_search_tags stags ON (stags.SEARCH_CONTENT_ID=stags2.SEARCH_CONTENT_ID and stags.SITE_ID=stags2.SITE_ID)
616 INNER JOIN b_search_content sc ON (stags.SEARCH_CONTENT_ID=sc.ID)
617 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
618 INNER JOIN b_search_content_site scsite ON (sc.ID=scsite.SEARCH_CONTENT_ID AND stags.SITE_ID=scsite.SITE_ID)
619 ' . $strSqlJoin2 . '
620 WHERE
621 ' . CSearch::CheckPermissions('sc.ID') . '
622 AND ' . ($this->Query->bTagsSearch ? (
623 //Index range scan optimization (make it for other queries ???)
624 is_array($this->Query->m_tags_words) && count($this->Query->m_tags_words) ?
625 "stags.name in ('" . implode("', '", $this->Query->m_tags_words) . "')" :
626 '(1=1)'
627 ) : '(' . $query . ')') . ' ' . $strSqlWhere . '
628 GROUP BY
629 stags2.NAME
630 ' . ($this->Query->bTagsSearch ? '
631 HAVING
632 (' . $query . ')' : '') . '
633 ' . $strSort . '
634 ';
635 }
636 }
637 elseif (!$bIncSites && $bStem)
638 {
639 $strSql = '
640 SELECT
641 stags.NAME
642 ,COUNT(DISTINCT stags.SEARCH_CONTENT_ID) as CNT
643 ,MAX(sc.DATE_CHANGE) DC_TMP
644 , ' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)') . ' as FULL_DATE_CHANGE
645 , ' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)', 'SHORT') . ' as DATE_CHANGE
646 ' . (count($this->Query->m_stemmed_words) > 1 && mb_strpos($query, 'searchable_content') !== false ? ',sct.SEARCHABLE_CONTENT' : '') . '
647 FROM b_search_tags stags
648 INNER JOIN b_search_content sc ON (stags.SEARCH_CONTENT_ID=sc.ID)
649 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
650 INNER JOIN b_search_content_stem st ON sc.id = st.search_content_id
651 ' . (count($this->Query->m_stemmed_words) > 1 ?
652 'INNER JOIN b_search_content_freq sf ON
653 st.language_id = sf.language_id
654 and st.stem=sf.stem
655 ' . ($this->tf_hwm_site_id <> '' ?
656 "and sf.SITE_ID = '" . $DB->ForSQL($this->tf_hwm_site_id, 2) . "'" :
657 'and sf.SITE_ID IS NULL'
658 ) :
659 ''
660 ) . '
661 WHERE
662 ' . CSearch::CheckPermissions('sc.ID') . '
663 AND st.STEM in (' . $strStemList . ')
664 ' . (count($this->Query->m_stemmed_words) > 1 ? 'AND sf.STEM in (' . $strStemList . ')' : '') . "
665 AND st.language_id='" . $this->Query->m_lang . "'
666 " . $strSqlWhere . '
667 GROUP BY
668 stags.NAME
669 ' . (count($this->Query->m_stemmed_words) > 1 ? '
670 ,sc.ID
671 HAVING
672 (' . $query . ') ' : '') . '
673 ' . $strSort . '
674 ';
675 }
676 else // if(!$bIncSites && !$bStem)
677 {
678 $strSql = '
679 SELECT
680 stags2.NAME
681 ,COUNT(DISTINCT stags.SEARCH_CONTENT_ID) as CNT
682 ,MAX(sc.DATE_CHANGE) DC_TMP
683 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)') . ' as FULL_DATE_CHANGE
684 ,' . $DB->DateToCharFunction('MAX(sc.DATE_CHANGE)', 'SHORT') . ' as DATE_CHANGE
685 FROM b_search_tags stags2
686 INNER JOIN b_search_tags stags ON (stags.SEARCH_CONTENT_ID=stags2.SEARCH_CONTENT_ID and stags.SITE_ID=stags2.SITE_ID)
687 INNER JOIN b_search_content sc ON (stags.SEARCH_CONTENT_ID=sc.ID)
688 ' . ($this->Query->bText ? 'INNER JOIN b_search_content_text sct ON sct.SEARCH_CONTENT_ID = sc.ID' : '') . '
689 WHERE
690 ' . CSearch::CheckPermissions('sc.ID') . '
691 AND ' . ($this->Query->bTagsSearch ? (
692 //Index range scan optimization (make it for other queries ???)
693 is_array($this->Query->m_tags_words) && count($this->Query->m_tags_words) ?
694 "stags.name in ('" . implode("', '", $this->Query->m_tags_words) . "')" :
695 '(1=1)'
696 ) : '(' . $query . ')') . ' ' . $strSqlWhere . '
697 GROUP BY
698 stags2.NAME
699 ' . ($this->Query->bTagsSearch ? '
700 HAVING
701 (' . $query . ')' : '') . '
702 ' . $strSort . '
703 ';
704 }
705
706 if ($limit < 1)
707 {
708 $limit = 150;
709 }
710
711 return $strSql . 'LIMIT ' . $limit;
712 }
713
714 public static function ReindexLock()
715 {
716 //do not lock for mysql database
717 }
718
719 public static function OnLangDelete($lang)
720 {
721 $DB = CDatabase::GetModuleConnection('search');
722 $DB->Query("
723 DELETE FROM b_search_content_site
724 WHERE SITE_ID='" . $DB->ForSql($lang) . "'
725 ");
727 }
728
729 public static function FormatDateString($strField)
730 {
731 $DB = CDatabase::GetModuleConnection('search');
732
733 return $DB->DateFormatToDB('DD.MM.YYYY HH:MI:SS', $strField);
734 }
735
736 public static function CleanFreqCache($ID)
737 {
738 $DB = CDatabase::GetModuleConnection('search');
739
740 $DB->Query('
741 UPDATE b_search_content_freq
742 SET TF = null
743 WHERE
744 TF is not null
745 AND (LANGUAGE_ID, STEM) IN (
746 SELECT LANGUAGE_ID, STEM
747 FROM b_search_content_stem
748 WHERE SEARCH_CONTENT_ID = ' . intval($ID) . '
749 )
750 ');
751 }
752
753 public static function IndexTitle($arLID, $ID, $sTitle)
754 {
755 $DB = CDatabase::GetModuleConnection('search');
756 $helper = $DB->getConnection()->getSqlHelper();
757 static $CACHE_SITE_LANGS = [];
758 $ID = intval($ID);
759
760 $arLang = [];
761 if (!is_array($arLID))
762 {
763 $arLID = [];
764 }
765 foreach ($arLID as $site => $url)
766 {
767 $sql_site = $DB->ForSql($site);
768
769 if (!array_key_exists($site, $CACHE_SITE_LANGS))
770 {
771 $db_site_tmp = CSite::GetByID($site);
772 if ($ar_site_tmp = $db_site_tmp->Fetch())
773 {
774 $CACHE_SITE_LANGS[$site] = [
775 'LANGUAGE_ID' => $ar_site_tmp['LANGUAGE_ID'],
776 'CHARSET' => $ar_site_tmp['CHARSET'],
777 'SERVER_NAME' => $ar_site_tmp['SERVER_NAME']
778 ];
779 }
780 else
781 {
782 $CACHE_SITE_LANGS[$site] = false;
783 }
784 }
785
786 if (is_array($CACHE_SITE_LANGS[$site]))
787 {
788 $lang = $CACHE_SITE_LANGS[$site]['LANGUAGE_ID'];
789
790 $dbTitle = [];
791 $rs = $DB->Query('select WORD, POS from b_search_content_title where SEARCH_CONTENT_ID = ' . $ID . " and SITE_ID='" . $sql_site . "'");
792 while ($ar = $rs->Fetch())
793 {
794 $dbTitle[$ar['WORD']] = intval($ar['POS']);
795 }
796
797 $arTitle = stemming_split($sTitle, $lang);
798 if (!empty($arTitle))
799 {
800 $maxValues = 100;
801 $arInsert = [];
802 foreach ($arTitle as $word => $pos)
803 {
804 if (isset($dbTitle[$word]) && $dbTitle[$word] === $pos)
805 {
806 //Already in the db
807 unset($dbTitle[$word]);
808 }
809 else
810 {
811 //New value
812 $arInsert[] = [
813 'SEARCH_CONTENT_ID' => $ID,
814 'SITE_ID' => $site,
815 'WORD' => $word,
816 'POS' => $pos,
817 ];
818 if (count($arInsert) > $maxValues)
819 {
820 $merge = $helper->prepareMergeMultiple('b_search_content_title', ['SITE_ID', 'WORD', 'SEARCH_CONTENT_ID', 'POS'], $arInsert);
821 if ($merge && $merge[0])
822 {
823 $DB->Query($merge[0]);
824 }
825 $arInsert = [];
826 }
827 }
828 }
829 if ($arInsert)
830 {
831 $merge = $helper->prepareMergeMultiple('b_search_content_title', ['SITE_ID', 'WORD', 'SEARCH_CONTENT_ID', 'POS'], $arInsert);
832 if ($merge && $merge[0])
833 {
834 $DB->Query($merge[0]);
835 }
836 }
837 //Delete obsolete db values
838 foreach ($dbTitle as $word => $pos)
839 {
840 $DB->Query('
841 delete from b_search_content_title
842 where SEARCH_CONTENT_ID = ' . $ID . " and SITE_ID='" . $sql_site . "'
843 and WORD = '" . $DB->ForSql($word) . "' and POS = " . $pos . '
844 ');
845 }
846 }
847 }
848 }
849 }
850
851 public static function RegisterStem($stem)
852 {
853 $DB = CDatabase::GetModuleConnection('search');
854 static $cache = [];
855
856 if (is_array($stem)) //This is batch check of the already exist stems
857 {
858 ksort($stem);
859
860 $strSqlPrefix = 'select * from b_search_stem where stem in (';
861 $maxValuesLen = 4096;
862 $maxValuesCnt = 1500;
863 $strSqlValues = '';
864 $i = 0;
865 foreach ($stem as $word => $count)
866 {
867 $strSqlValues .= ",'" . $DB->ForSQL($word) . "'";
868 $i++;
869
870 if (mb_strlen($strSqlValues) > $maxValuesLen || $i > $maxValuesCnt)
871 {
872 $rs = $DB->Query($strSqlPrefix . mb_substr($strSqlValues, 1) . ')');
873 while ($ar = $rs->Fetch())
874 {
875 $cache[$ar['STEM']] = $ar['ID'];
876 }
877
878 $strSqlValues = '';
879 $i = 0;
880 }
881 }
882
883 if ($strSqlValues <> '')
884 {
885 $rs = $DB->Query($strSqlPrefix . mb_substr($strSqlValues, 1) . ')');
886 while ($ar = $rs->Fetch())
887 {
888 $cache[$ar['STEM']] = $ar['ID'];
889 }
890 }
891
892 return;
893 }
894
895 if (!isset($cache[$stem]))
896 {
897 $rs = $DB->Query("insert into b_search_stem (STEM) values ('" . $DB->ForSQL($stem) . "')", true);
898 if ($rs === false)
899 {
900 $rs = $DB->Query("select ID from b_search_stem WHERE STEM = '" . $DB->ForSQL($stem) . "'");
901 $ar = $rs->Fetch();
902 $cache[$stem] = $ar['ID'];
903 }
904 else
905 {
906 $cache[$stem] = $DB->LastID();
907 }
908 }
909
910 return $cache[$stem];
911 }
912
913 public static function StemIndex($arLID, $ID, $sContent)
914 {
915 $DB = CDatabase::GetModuleConnection('search');
916 $helper = $DB->getConnection()->getSqlHelper();
917 static $CACHE_SITE_LANGS = [];
918 $ID = intval($ID);
919
920 $arLang = [];
921 if (!is_array($arLID))
922 {
923 $arLID = [];
924 }
925
926 foreach ($arLID as $site => $url)
927 {
928 if (!array_key_exists($site, $CACHE_SITE_LANGS))
929 {
930 $db_site_tmp = CSite::GetByID($site);
931 if ($ar_site_tmp = $db_site_tmp->Fetch())
932 {
933 $CACHE_SITE_LANGS[$site] = [
934 'LANGUAGE_ID' => $ar_site_tmp['LANGUAGE_ID'],
935 'CHARSET' => $ar_site_tmp['CHARSET'],
936 'SERVER_NAME' => $ar_site_tmp['SERVER_NAME']
937 ];
938 }
939 else
940 {
941 $CACHE_SITE_LANGS[$site] = false;
942 }
943 }
944 if (is_array($CACHE_SITE_LANGS[$site]))
945 {
946 $arLang[$CACHE_SITE_LANGS[$site]['LANGUAGE_ID']] = true;
947 }
948 }
949
950 foreach ($arLang as $lang => $value)
951 {
952 $sql_lang = $DB->ForSql($lang);
953
954 $arDoc = stemming($sContent, $lang);
955 $docLength = array_sum($arDoc);
956
957 $arPos = stemming($sContent, $lang, false, true);
958 CSearch::RegisterStem($arDoc);
959
960 if ($docLength > 0)
961 {
962 $doc = '';
963 $logDocLength = log($docLength < 20 ? 20 : $docLength);
964
965 $maxValues = 100;
966 $arInsert = [];
967 foreach ($arDoc as $word => $count)
968 {
969 $stem_id = CSearch::RegisterStem($word);
970 //This is almost impossible, but happens
971 if ($stem_id > 0)
972 {
973 $arInsert[] = [
974 'SEARCH_CONTENT_ID' => $ID,
975 'LANGUAGE_ID' => $lang,
976 'STEM' => $stem_id,
977 'TF' => number_format(log($count + 1) / $logDocLength, 4, '.', ''),
978 'PS' => number_format($arPos[$word] / $count, 4, '.', ''),
979 ];
980 }
981
982 if (count($arInsert) > $maxValues)
983 {
984 $merge = $helper->prepareMergeMultiple('b_search_content_stem', ['STEM', 'LANGUAGE_ID', 'TF', 'PS', 'SEARCH_CONTENT_ID'], $arInsert);
985 if ($merge && $merge[0])
986 {
987 $DB->Query($merge[0]);
988 }
989 $arInsert = [];
990 }
991 }
992
993 if ($arInsert)
994 {
995 $merge = $helper->prepareMergeMultiple('b_search_content_stem', ['STEM', 'LANGUAGE_ID', 'TF', 'PS', 'SEARCH_CONTENT_ID'], $arInsert);
996 if ($merge && $merge[0])
997 {
998 $DB->Query($merge[0]);
999 }
1000 }
1001 }
1002 }
1003 }
1004
1005 public static function TagsIndex($arLID, $ID, $sContent)
1006 {
1007 $DB = CDatabase::GetModuleConnection('search');
1008 $helper = $DB->getConnection()->getSqlHelper();
1009 $ID = intval($ID);
1010
1011 if (!is_array($arLID))
1012 {
1013 $arLID = [];
1014 }
1015 $sContent = str_replace("\x00", '', $sContent);
1016
1017 foreach ($arLID as $site_id => $url)
1018 {
1019 $arTags = tags_prepare($sContent, $site_id);
1020 if ($arTags)
1021 {
1022 CSearchTags::CleanCache($arTags);
1023
1024 $maxValues = 100;
1025 $arInsert = [];
1026 foreach ($arTags as $tag)
1027 {
1028 $arInsert[] = [
1029 'SEARCH_CONTENT_ID' => $ID,
1030 'SITE_ID' => $site_id,
1031 'NAME' => $tag,
1032 ];
1033
1034 if (count($arInsert) > $maxValues)
1035 {
1036 $merge = $helper->prepareMergeMultiple('b_search_tags', ['SEARCH_CONTENT_ID', 'SITE_ID', 'NAME'], $arInsert);
1037 if ($merge && $merge[0])
1038 {
1039 $DB->Query($merge[0]);
1040 }
1041 $arInsert = [];
1042 }
1043 }
1044
1045 if ($arInsert)
1046 {
1047 $merge = $helper->prepareMergeMultiple('b_search_tags', ['SEARCH_CONTENT_ID', 'SITE_ID', 'NAME'], $arInsert);
1048 if ($merge && $merge[0])
1049 {
1050 $DB->Query($merge[0]);
1051 }
1052 }
1053 }
1054 }
1055 }
1056
1057 public static function UpdateSite($ID, $arSITE_ID)
1058 {
1059 $DB = CDatabase::GetModuleConnection('search');
1060 $helper = $DB->getConnection()->getSqlHelper();
1061 $ID = intval($ID);
1062 if (!is_array($arSITE_ID))
1063 {
1064 $DB->Query('
1065 DELETE FROM b_search_content_site
1066 WHERE SEARCH_CONTENT_ID = ' . $ID . '
1067 ');
1068 }
1069 else
1070 {
1071 $rsSite = $DB->Query('
1072 SELECT SITE_ID, URL
1073 FROM b_search_content_site
1074 WHERE SEARCH_CONTENT_ID = ' . $ID . '
1075 ');
1076 while ($arSite = $rsSite->Fetch())
1077 {
1078 if (!array_key_exists($arSite['SITE_ID'], $arSITE_ID))
1079 {
1080 $DB->Query('
1081 DELETE FROM b_search_content_site
1082 WHERE SEARCH_CONTENT_ID = ' . $ID . "
1083 AND SITE_ID = '" . $DB->ForSql($arSite['SITE_ID']) . "'
1084 ");
1085 }
1086 else
1087 {
1088 if ($arSite['URL'] !== $arSITE_ID[$arSite['SITE_ID']])
1089 {
1090 $DB->Query("
1091 UPDATE b_search_content_site
1092 SET URL = '" . $DB->ForSql($arSITE_ID[$arSite['SITE_ID']], 2000) . "'
1093 WHERE SEARCH_CONTENT_ID = " . $ID . "
1094 AND SITE_ID = '" . $DB->ForSql($arSite['SITE_ID']) . "'
1095 ");
1096 }
1097 unset($arSITE_ID[$arSite['SITE_ID']]);
1098 }
1099 }
1100
1101 $arInsert = [];
1102 foreach ($arSITE_ID as $site => $url)
1103 {
1104 $arInsert[] = [
1105 'SEARCH_CONTENT_ID' => $ID,
1106 'SITE_ID' => $site,
1107 'URL' => $url,
1108 ];
1109 }
1110 $merge = $helper->prepareMergeMultiple('b_search_content_site', ['SEARCH_CONTENT_ID', 'SITE_ID'], $arInsert);
1111 if ($merge && $merge[0])
1112 {
1113 $DB->Query($merge[0]);
1114 }
1115 }
1116 }
1117}
1118
1120{
1121 var $cnt = 0;
1122
1123 function BuildWhereClause($word)
1124 {
1125 $DB = CDatabase::GetModuleConnection('search');
1126
1127 $this->cnt++;
1128 if ($this->cnt > 10)
1129 {
1130 return '1=1';
1131 }
1132
1133 if (isset($this->m_kav[$word]))
1134 {
1135 $word = $this->m_kav[$word];
1136 $bInQuotes = true;
1137 }
1138 else
1139 {
1140 $bInQuotes = false;
1141 }
1142 $this->m_words[] = $word;
1143 $word = $DB->ForSql($word, 100);
1144
1145 if ($this->bTagsSearch)
1146 {
1147 if (mb_strpos($word, '%') === false)
1148 {
1149 //We can optimize query by doing range scan
1150 if (is_array($this->m_tags_words))
1151 {
1152 $this->m_tags_words[] = $word;
1153 }
1154 $op = '=';
1155 }
1156 else
1157 {
1158 //Optimization is not possible
1159 $this->m_tags_words = false;
1160 $op = 'like';
1161 }
1162 return '(sum(case when stags.name ' . $op . " '" . $word . "' then 1 else 0 end)>0)";
1163 }
1164 elseif ($this->bStemming && !$bInQuotes)
1165 {
1166 $word = mb_strtoupper($word);
1167 $this->m_stemmed_words[] = $word;
1168
1169 $rs = $DB->Query("select ID from b_search_stem where STEM='" . $DB->ForSQL($word) . "'");
1170 $ar = $rs->Fetch();
1171 $this->m_stemmed_words_id[] = intval($ar['ID']);
1172
1173 return '(sum(case when st.stem = ' . intval($ar['ID']) . ' then 1 else 0 end)>0)';
1174 }
1175 else
1176 {
1177 $this->bText = true;
1178
1179 return "(sct.searchable_content LIKE '%" . str_replace(['%', '_'], ['\\%', '\\_'], mb_strtoupper($word)) . "%')";
1180 }
1181 }
1182}
$count
Определения admin_tab.php:4
$DB
Определения dbresult.php:40
Определения search.php:10
$strSqlWhere
Определения search.php:15
normdev($words_count)
Определения search.php:2826
CSearch($strQuery=false, $LID=false, $MODULE_ID=false, $ITEM_ID=false, $PARAM1=false, $PARAM2=false, $aSort=[], $aParamsEx=[], $bTagsCloud=false)
Определения search.php:43
static CheckPermissions($FIELD='sc.ID')
Определения search.php:2660
$limit
Определения search.php:26
Определения search.php:3260
static CleanFreqCache($ID)
Определения search.php:736
static TagsIndex($arLID, $ID, $sContent)
Определения search.php:1005
static IndexTitle($arLID, $ID, $sTitle)
Определения search.php:753
static FormatDateString($strField)
Определения search.php:729
static RegisterStem($stem)
Определения search.php:851
MakeSQL($query, $strSqlWhere, $strSort, $bIncSites, $bStem)
Определения search.php:120
static StemIndex($arLID, $ID, $sContent)
Определения search.php:913
static OnLangDelete($lang)
Определения search.php:719
static UpdateSite($ID, $arSITE_ID)
Определения search.php:1057
static ReindexLock()
Определения search.php:714
tagsMakeSQL($query, $strSqlWhere, $strSort, $bIncSites, $bStem, $limit=100)
Определения search.php:506
Определения search.php:1120
BuildWhereClause($word)
Определения search.php:1123
$cnt
Определения search.php:1121
static CleanCache($arTags='', $content_id=false)
Определения tags.php:234
$query
Определения get_search.php:11
if($ajaxMode) $ID
Определения get_user.php:27
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
if(!defined('SITE_ID')) $lang
Определения include.php:91
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
tags_prepare($sText, $site_id=false)
Определения tags.php:4
$site_id
Определения sonet_set_content_view.php:9
stemming_split($sText, $sLang='ru')
Определения stemming.php:122
stemming($sText, $sLang='ru', $bIgnoreStopWords=false, $bReturnPositions=false)
Определения stemming.php:148
$rs
Определения action.php:82
$url
Определения iframe.php:7
$site
Определения yandex_run.php:614