27 abstract function delete( $index );
45 abstract function reset();
63 abstract function update($index, $page);
84 abstract function search($search, $relation, $query);
104 public function globalSearch($search, $sites = array(), $query = array(), $param = array(), $sort = array(), $filter =
'') {
111 foreach ($sites as $site) {
112 if (is_string($site)) {
113 $site =
new Site($site);
116 $lang = $_REQUEST[
'lang'] ? $_REQUEST[
'lang'] : ($GLOBALS[
'site'] ? $GLOBALS[
'site']->language : null);
118 $site->setLanguage($lang);
120 }
catch (Exception $e) {
124 foreach ($site->getPages($query, array_merge($param, array(
'fulltext' => $search,
'filter' => $filter))) as $page) {
128 return $this->
sortPages($pages, $query[
'order'], $sort);
150 protected function sortPages($pages, $order =
'', $sort = array()) {
151 if (!empty($order) && preg_match(
'/^([^ ]+) ?(asc|desc)?/i', $order, $match)) {
153 } elseif (!empty($sort)) {
170 $content = str_replace(
',',
' ', $page->getKeywords($page->getSite()->language,
true));
171 if ($page->getSite()->admin[
'keyword_register_own_site']) {
172 $keyword_parents = $page->getParents(array(
173 'fields' =>
'name,extra',
174 'where' =>
"type='_keywords/entry'" 178 foreach ($keyword_parents as $keyword) {
179 $content .=
' '.$keyword->field[
'name'];
182 require_once
'base/Ego_Combo.php';
183 $combo =
new Ego_Combo($keyword->extra[
'synonym']);
184 foreach ($combo->getText() as $text) {
185 $content .=
' '.$text;
194 $content = implode(
' ', $extra);
199 $content = $page->field[$k];
217 $content = preg_replace(
'/(?<!\d)(0|1)(?!\d)/',
'', $content);
232 in_array($k, array(
'short',
'content',
'extra'))
233 && is_string($content)
234 && preg_match_all(
'/(title|alt)=(["\'])(.*?)\\2/ims', $content, $matches)
237 foreach ($matches[3] as $match) {
238 $content .=
" $match";
242 $content = preg_replace(
'/<[^>]*>/',
' ', $content);
243 $content = preg_replace(
'/&[^ ;]+;/',
' ', $content);
244 $content = preg_replace(
'/\s+/',
' ', $content);
245 $content = strtr($content,
"\"\n\r\t",
' ');
246 return trim($content);
256 $extra = $page->extra;
257 if (!is_array($extra)) {
262 $extra[
'language_link'],
263 $extra[
'language_standard'],
264 $extra[
'origImgWidth'],
265 $extra[
'origImgHeight'],
266 $extra[
'origFileSize'],
268 $extra[
'clone_original'],
276 $site = $page->getSite();
277 if ($file = $site->getSiteFile(
'admin/search_index.php')) {
279 $extra = search_index($page, $extra);
313 foreach (preg_split(
'/(and|or)/si', $query) as $sub_query) {
314 if (preg_match(
'/(!?extra\.[^ ]+)(\s*(!=|=)\s*(.*?))?$/si', trim($sub_query,
'() '), $matches)) {
315 $param = $matches[1];
316 if (!in_array($GLOBALS[
'egotec_conf'][
'search_engine'], [
'lucene',
'elastic'])) {
317 $param = substr($param, 6);
319 $operator = mb_strtolower($matches[3]);
320 $value = trim($matches[4],
'\'"'); 321 if (is_numeric($value)) { 322 $value = (int) $value; 325 // Wert darf nicht im Extrafeld gesetzt sein 327 if ($param[0] == '!') { 329 $param = substr($param, 1); 332 // Für die Extra Suche mit den SQL Treibern gibt es keine Binds 333 if (is_array($bind) && strpos($value, ':') === 0 && isset($bind[substr($value, 1)])) { 334 $value = $bind[substr($value, 1)]; 339 $replace = "extra NOT LIKE
'%s:" . strlen($param) . ":" . $param . ";%'"; 341 // SQL Syntax schreiben 343 if (is_string($value)) { 344 $value = "'%s:" . strlen($param) . ":\"" . $param . "\";s:" . strlen($value) . ":\"" . $value . "\"%'"; 346 $value = "'%s:" . strlen($param) . ":\"" . $param . "\";_:" . $value . "%'"; 352 $replace .= "LIKE $value
"; 355 $replace .= "NOT LIKE $value
"; 358 $replace .= "LIKE $value
"; 362 $sql_query = str_replace($matches[0], $replace, $sql_query); 366 $this->extraQuery = $sql_query; 378 protected function prepareSearch($search, $filter = '', $original = false, $fuzzy = false) { 379 $search = mb_strtolower(trim($search)); 380 foreach (array('+', '-', '~', '&') as $char) { 381 // Diese Zeichen dürfen nicht mehrmals nacheinander vorkommen 382 $search = preg_replace('/[' . $char . ']{2,}/', $char, $search); 384 // Andere Lucene Query Zeichen escapen 385 $search = preg_replace('%([\|!(){}[\]^*?:/]+)%', '\\\\$1', $search); 387 // Hotfix: Punkt am Ende funktioniert nicht 388 $search = rtrim($search, '.'); 390 $search_asterix = ''; // Die Suche mit * erweitern 391 $search_fuzzy = ''; // Die Suche mit ~ erweitern 396 // Fuzzy Einstellung setzen 398 if ($GLOBALS['egotec_conf']['search']['fuzzy_num']) { 399 $fuzzy_num = $GLOBALS['egotec_conf']['search']['fuzzy_num']; 402 for ($i = 0; $i < strlen($search); $i++) { 403 $character = $search[$i]; 404 switch ($character) { 406 if ($in_string == '"') { 411 $search_asterix .= $character; 412 $search_fuzzy .= $character; 414 $search_fuzzy .= '~
' . $fuzzy_num; 422 && !in_array(substr($search_asterix, -1), array('"', '*')) 424 $search_asterix .= '*'; 425 $search_fuzzy .= '~' . $fuzzy_num; 427 $search_asterix .= $character; 428 $search_fuzzy .= $character; 429 $in_word = $in_fuzzy = ''; 432 // Suche mit Bindestrichen ermöglichen 433 if ($search_asterix != '' && substr($search_asterix, -1) != ' ') { 434 $search_asterix .= ' '; // @TODO Workaround, nicht die Lösung. 436 $search_asterix .= $character; 440 // Suche mit Tilde (Fuzzy Search) 441 $search_asterix = substr_replace($search_asterix, '', strrpos($search_asterix, '*'), 1); 442 $search_asterix .= $character; 443 $search_fuzzy .= $character; 444 $in_fuzzy = $character; 447 if ($this->config['leading_wildcard'] && !$in_word) { 448 // Asterix vor einem Wort 449 if (!$in_string && !in_array($character, array('+', '-', '*')) && $search_asterix[strlen($search_asterix) - 1] != '-') { 450 $search_asterix .= '*'; 452 $in_word = $character; 454 $search_asterix .= $character; 455 $search_fuzzy .= $character; 458 if ($character != '"' && !$in_fuzzy) { 459 if ($character != '*
') { 460 // Am Ende noch einen Asterix hinzufügen 461 $search_asterix .= '*
'; 463 if ($search_asterix != '*
' && $character != '~
') { 464 // Am Ende noch eine Tilde hinzufügen 465 $search_fuzzy .= '~
' . $fuzzy_num; 469 $search_string = $search_asterix; 471 $search_string .= " $search_fuzzy"; 475 // Lucene Filter hinzufügen 476 if (is_string($filter) && !empty($filter)) { 477 if ($search_string == '*
') { 478 $search_string = $filter; 480 $search_string = "($search_string) AND ($filter)"; 484 // Zusätzlicher Query für die Extra Suche 485 if (!empty($this->extraQuery)) { 486 if ($search_string == '*
') { 487 $search_string = $this->extraQuery; 489 $search_string = "($search_string) AND ({$this->extraQuery})"; 493 // Ausrufezeichen maskieren 494 $search_string = str_replace('!
', '\!
', $search_string); 497 return $search_string; 503 function clearCache() { 513 protected function checkSearch($search) { 514 $maxlength = $GLOBALS['egotec_conf
']['search']['maxlength
'] 515 ? $GLOBALS['egotec_conf
']['search']['maxlength
'] 517 if (mb_strlen($search) > $maxlength) { 518 Ego_System::header(400);
static arrayFlatRecursive($array, $callback=null)
static getAllSites($username='', $perm='', $table=false, $type='')
static sortPages($pages, $sorttype='field', $sortby='id', $sortdirection="asc")
_getExtra($page, $clean=false)
sortPages($pages, $order='', $sort=array())
globalSearch($search, $sites=array(), $query=array(), $param=array(), $sort=array(), $filter='')
search($search, $relation, $query)
static arrayValuesRecursive($array)
filterContent($content, $k='extra')
setExtraQuery($query, $bind=array())