1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
stemtable.php
См. документацию.
1<?php
3
5{
6 public function connect($connectionIndex, $indexName = '')
7 {
8 }
9
10 public function truncate()
11 {
12 $DB = CDatabase::GetModuleConnection('search');
13
14 $DB->Query('TRUNCATE TABLE b_search_stem');
15 $DB->Query('TRUNCATE TABLE b_search_content_text');
16 $DB->Query('TRUNCATE TABLE b_search_content_stem');
17 }
18
19 public function deleteById($ID)
20 {
21 $DB = CDatabase::GetModuleConnection('search');
22
23 $DB->Query('DELETE FROM b_search_content_text WHERE SEARCH_CONTENT_ID = ' . $ID);
24 $DB->Query('DELETE FROM b_search_content_stem WHERE SEARCH_CONTENT_ID = ' . $ID);
25 }
26
27 public function update($ID, $arFields)
28 {
29 $DB = CDatabase::GetModuleConnection('search');
30 if (!isset($arFields['SITE_ID']))
31 {
32 $dbSites = $DB->Query('SELECT * from b_search_content_site WHERE SEARCH_CONTENT_ID = ' . $ID);
33 while ($site = $dbSites->fetch())
34 {
35 $arFields['SITE_ID'][$site['SITE_ID']] = $site['URL'];
36 }
37 }
38
39 return $this->replace($ID, $arFields);
40 }
41
42 public function replace($ID, $arFields)
43 {
44 $DB = CDatabase::GetModuleConnection('search');
45 $helper = $DB->getConnection()->getSqlHelper();
46
47 if (array_key_exists('SEARCHABLE_CONTENT', $arFields))
48 {
49 $text_md5 = md5($arFields['SEARCHABLE_CONTENT']);
50 $rsText = $DB->Query('SELECT SEARCH_CONTENT_MD5 FROM b_search_content_text WHERE SEARCH_CONTENT_ID = ' . $ID);
51 $arText = $rsText->Fetch();
52 if (!$arText || $arText['SEARCH_CONTENT_MD5'] !== $text_md5)
53 {
55 $DB->Query('DELETE FROM b_search_content_stem WHERE SEARCH_CONTENT_ID = ' . $ID);
56 if (COption::GetOptionString('search', 'agent_stemming') === 'Y')
57 {
59 }
60 else
61 {
62 CSearch::StemIndex($arFields['SITE_ID'], $ID, $arFields['SEARCHABLE_CONTENT']);
63 }
64
65 $merge = $helper->prepareMerge('b_search_content_text', ['SEARCH_CONTENT_ID'], [
66 'SEARCH_CONTENT_ID' => $ID,
67 'SEARCH_CONTENT_MD5' => $text_md5,
68 'SEARCHABLE_CONTENT' => $arFields['SEARCHABLE_CONTENT']
69 ], [
70 'SEARCH_CONTENT_MD5' => $text_md5,
71 'SEARCHABLE_CONTENT' => $arFields['SEARCHABLE_CONTENT']
72 ]);
73 if ($merge && $merge[0])
74 {
75 $DB->Query($merge[0]);
76 }
77 }
78 }
79 }
80
81 public static function DelayStemIndex($ID)
82 {
83 $DB = CDatabase::GetModuleConnection('search');
84 $ID = intval($ID);
85
86 $DB->Query('
87 delete from b_search_content_stem
88 where SEARCH_CONTENT_ID = -' . $ID
89 );
90 $DB->Query('
91 insert into b_search_content_stem
92 (SEARCH_CONTENT_ID, LANGUAGE_ID, STEM, TF, PS)
93 values
94 (-' . $ID . ', \'en\', 0, 0, 0)
95 ');
96
97 CSearchStemTable::_addAgent();
98 }
99
100 private static function _addAgent()
101 {
102 global $APPLICATION;
103
104 static $bAgentAdded = false;
105 if (!$bAgentAdded)
106 {
107 $bAgentAdded = true;
108 $rsAgents = CAgent::GetList(['ID' => 'DESC'], ['NAME' => 'CSearchStemTable::DelayedStemIndex(%']);
109 if (!$rsAgents->Fetch())
110 {
111 $res = CAgent::AddAgent(
112 'CSearchStemTable::DelayedStemIndex();',
113 'search', //module
114 'N', //period
115 1 //interval
116 );
117
118 if (!$res)
119 {
120 $APPLICATION->ResetException();
121 }
122 }
123 }
124 }
125
126 public static function DelayedStemIndex()
127 {
128 $DB = CDatabase::GetModuleConnection('search');
129 $etime = time() + intval(COption::GetOptionString('search', 'agent_duration'));
130 do {
131 $stemQueue = $DB->Query($DB->TopSql('
132 SELECT SEARCH_CONTENT_ID ID
133 FROM b_search_content_stem
134 WHERE SEARCH_CONTENT_ID < 0
135 ', 1));
136 if ($stemTask = $stemQueue->Fetch())
137 {
138 $ID = -$stemTask['ID'];
139
140 $sites = [];
141 $rsSite = $DB->Query('
142 SELECT SITE_ID, URL
143 FROM b_search_content_site
144 WHERE SEARCH_CONTENT_ID = ' . $ID . '
145 ');
146 while ($arSite = $rsSite->Fetch())
147 {
148 $sites[$arSite['SITE_ID']] = $arSite['URL'];
149 }
150
151 $rsContent = $DB->Query('SELECT SEARCHABLE_CONTENT from b_search_content_text WHERE SEARCH_CONTENT_ID = ' . $ID);
152 if ($arContent = $rsContent->Fetch())
153 {
154 $DB->Query('DELETE FROM b_search_content_stem WHERE SEARCH_CONTENT_ID = ' . $ID);
155 CSearch::StemIndex($sites, $ID, $arContent['SEARCHABLE_CONTENT']);
156 }
157 $DB->Query('DELETE FROM b_search_content_stem WHERE SEARCH_CONTENT_ID = ' . $stemTask['ID']);
158 }
159 else
160 {
161 //Cancel the agent
162 return '';
163 }
164 } while ($etime >= time());
165 return 'CSearchStemTable::DelayedStemIndex();';
166 }
167}
$dbSites
Определения options.php:14
global $APPLICATION
Определения include.php:80
Определения full_text.php:4
static CleanFreqCache($ID)
Определения search.php:736
static StemIndex($arLID, $ID, $sContent)
Определения search.php:913
Определения stemtable.php:5
update($ID, $arFields)
Определения stemtable.php:27
connect($connectionIndex, $indexName='')
Определения stemtable.php:6
static DelayStemIndex($ID)
Определения stemtable.php:81
deleteById($ID)
Определения stemtable.php:19
truncate()
Определения stemtable.php:10
replace($ID, $arFields)
Определения stemtable.php:42
static DelayedStemIndex()
Определения stemtable.php:126
$sites
Определения clear_component_cache.php:15
$arFields
Определения dblapprove.php:5
$res
Определения filter_act.php:7
if($ajaxMode) $ID
Определения get_user.php:27
global $DB
Определения cron_frame.php:29
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
$site
Определения yandex_run.php:614