6 require_once(
'base/Ego_Search.php');
29 $this->_table = $table.$suffix;
30 $this->_count = $table.
'_fullnum';
38 function delete($index)
40 assert(is_numeric($index));
41 $db = new_db_connection();
43 'table' => $this->_table,
44 'where' =>
'id='.$index,
49 'table' => $this->_count,
50 'where' =>
'id='.$index,
65 throw new Exception(
'Die SQL Suche kann mit dem mysql Treiber nicht verwendet werden, bitte verwenden Sie den mysqli Treiber.');
67 $db = new_db_connection();
71 'name' =>
'varchar(255)/*bin*/',
74 'PRIMARY KEY' =>
'name,id',
97 function update($index, $page, $count = array())
99 $count_keys = array();
100 $count_words = $this->_countAllWords($page, $count);
102 foreach ($count as $k => $c)
105 $c = ceil($count_words * ($c / 100));
108 $content_keys = explode(
' ', $this->
_getContent($page, $k));
110 foreach ($content_keys as $key)
115 if (strlen($key)<250)
117 $key = mb_strtolower($key);
118 if ($count_keys[$key])
120 $count_keys[$key] += $c;
122 $count_keys[$key] = $c;
125 $content2 = strtr($key,
'"\'(),-+;:.#~*@_/',
' ');
126 $content_keys2 = explode(
' ', $content2);
128 foreach ($content_keys2 as $key2)
133 while (mb_strlen($key2)>=2)
137 if ($count_keys[$key2])
139 $count_keys[$key2] += $c;
141 $count_keys[$key2] = $c;
144 $key2 = mb_substr($key2, 1);
153 $this->
delete($index);
154 $db = new_db_connection();
156 foreach ($count_keys as $key => $count)
160 'table' => $this->_table,
161 'set' => array(
'name' => $key,
'id' => $index,
'count' => $count),
168 'table' => $this->_count,
169 'set' => array(
'id' => $index,
'count' => $count_words),
184 private function _countAllWords($page, $count)
188 foreach ($count as $k => $c)
190 $content_keys = explode(
' ', $this->
_getContent($page, $k));
192 foreach ($content_keys as $key)
197 if (strlen($key)>=2 && strlen($key)<250)
275 function search($search, $relation, $query, $use_query_andorscore=
false, $id_field=
'id', $name_field=
'name',
276 $count_field=
'count', $cond_field=
'', $more_tables=
'', $more_where=
'', $score_select=
'', $lower=
false)
282 $name_field =
'LOWER('.$this->_table.
'.'.$name_field.
')';
284 $name_field = $this->_table.
'.'.$name_field;
286 $search = mb_strtolower(trim($search));
287 $cond_field2 = $cond_field?$cond_field:$this->_table.
'.'.$id_field;
288 $search_asterix =
'';
291 for ($i=0; $i<strlen($search); $i++)
293 $character = $search[$i];
300 if (!$query[
'having']) {
301 $query[
'having'] =
"1=1";
303 $query[
'having'].=
" AND (name LIKE :insearch OR title LIKE :insearch OR short LIKE :insearch OR content LIKE :insearch OR extra LIKE :insearch)";
304 $query[
'bind'][
'insearch'] =
'%'.$in_search.
'%';
309 $search_asterix.=
'+';
315 $search_asterix.=
'*';
317 $search_asterix.= $character;
319 $in_search.= $character;
320 $search_asterix.=
'+';
325 $in_search.= $character;
327 $search_asterix.= $character;
332 $search_asterix.=
'*';
334 $search = $search_asterix;
336 $search = strtr($search,
'*',
'%');
337 $search = preg_replace(
'/\+ +/',
'+', $search);
338 $search = preg_replace(
'/\- +/',
'-', $search);
339 $parts = explode(
' ', $search);
341 $query_and = array();
343 $query_score = array();
345 foreach($parts as $part)
351 $part = mb_strtolower($part,
'UTF-8');
354 $part = substr($part, 1);
355 $and = $relation.
' IN (SELECT '.$cond_field2.
' FROM '.$this->_table.$more_tables.
356 ' WHERE '.$name_field.
' LIKE :part'.$i.($more_where?
' AND '.$more_where:
'').
')';
357 $query[
'bind'][
'part'.$i] = $part;
358 if ($use_query_andorscore)
360 $query[
'andor'][$part][] = $and;
364 $query_score[] = $name_field.
' LIKE :part'.$i;
365 } elseif ($part[0] ==
'-')
367 $part = substr($part, 1);
368 $and= $relation.
' NOT IN (SELECT '.$cond_field2.
' FROM '.$this->_table.$more_tables.
369 ' WHERE '.$name_field.
' LIKE :part'.$i.($more_where?
' AND '.$more_where:
'').
')';
370 $query[
'bind'][
'part'.$i] = $part;
371 if ($use_query_andorscore)
373 $query[
'and'][] = $and;
380 $like = $name_field.
' LIKE :part'.$i;
381 $query[
'bind'][
'part'.$i] = $part;
382 $part2 = $this->
replace($part);
385 $like2 = $name_field.
' LIKE :parta'.$i;
386 $query[
'bind'][
'parta'.$i] = $part2;
387 $like =
'('.$like.
' OR '.$like2.
')';
389 $part3 = $this->
replace($part,
true);
392 $like3 = $name_field.
' LIKE :partb'.$i;
393 $query[
'bind'][
'partb'.$i] = $part3;
394 $like =
'('.$like.
' OR '.$like3.
')';
396 $query_or[] = $relation.
' IN (SELECT '.$cond_field2.
' FROM '.$this->_table.$more_tables.
397 ' WHERE '.$like.($more_where?
' AND '.$more_where:
'').
')';
398 $query_score[] = $like;
404 $query[
'where'] .=
"\n AND ".join(
' AND ', $query_and);
408 if ($use_query_andorscore)
410 if (is_array($query[
'or']))
412 $query[
'or'] = array_merge($query[
'or'], $query_or);
414 $query[
'or'] = $query_or;
417 $query[
'where'] .=
"\n AND ( (".join(
') OR (', $query_or).
') )';
420 if ($count_field && $query_score)
422 $score =
'(SELECT SUM('.$this->_table.
'.'.$count_field.
') FROM '.$this->_table.
' WHERE '.
423 $relation.
'='.$this->_table.
'.'.$id_field.
' AND ('.join(
' OR ',$query_score).
') GROUP BY '.$this->_table.
'.'.$id_field.
') * '.
424 round(50/
sizeof($query_score)).
' / '.
425 '(SELECT '.$count_field.
' FROM '.$this->_count.
' WHERE '.$this->_count.
'.'.$id_field.
'='.$relation.
')';
426 if ($use_query_andorscore)
428 $query[
'score'][] = $score;
430 $query[
'fields2'] =
'('.$score.
') AS score';
432 if (!isset($query[
'order']))
434 $query[
'order'] =
'score DESC';
437 if ($score_select && $query_score)
439 $score = $score_select.
' AND ('.join(
' OR ',$query_score).
') AND '.$relation.
'='.$cond_field2;
441 $query[
'score'] = array($score);
443 if (!isset($query[
'order']))
445 $query[
'order'] =
'score DESC';
448 if ($this->extraQuery) {
449 if ($query[
'where']) {
450 $query[
'where'] .=
" AND {$this->extraQuery}";
replace($part, $reverse=false)
update($index, $page, $count=array())
search($search, $relation, $query, $use_query_andorscore=false, $id_field='id', $name_field='name', $count_field='count', $cond_field='', $more_tables='', $more_where='', $score_select='', $lower=false)
__construct($table, $suffix='_fulltext')