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',
99 function update($index, $page, $count = array(), $recursive =
true)
101 $count_keys = array();
102 $count_words = $this->_countAllWords($page, $count);
104 foreach ($count as $k => $c)
107 $c = ceil($count_words * ($c / 100));
110 $content_keys = explode(
' ', $this->
_getContent($page, $k));
112 foreach ($content_keys as $key)
117 if (strlen($key)<250)
119 $key = mb_strtolower($key);
120 if ($count_keys[$key])
122 $count_keys[$key] += $c;
124 $count_keys[$key] = $c;
127 $content2 = strtr($key,
'"\'(),-+;:.#~*@_/',
' ');
128 $content_keys2 = explode(
' ', $content2);
130 foreach ($content_keys2 as $key2)
135 while (mb_strlen($key2)>=2)
139 if ($count_keys[$key2])
141 $count_keys[$key2] += $c;
143 $count_keys[$key2] = $c;
146 $key2 = mb_substr($key2, 1);
155 $this->
delete($index);
156 $db = new_db_connection();
158 foreach ($count_keys as $key => $count)
162 'table' => $this->_table,
163 'set' => array(
'name' => $key,
'id' => $index,
'count' => $count),
170 'table' => $this->_count,
171 'set' => array(
'id' => $index,
'count' => $count_words),
186 private function _countAllWords($page, $count)
190 foreach ($count as $k => $c)
192 $content_keys = explode(
' ', $this->
_getContent($page, $k));
194 foreach ($content_keys as $key)
199 if (strlen($key)>=2 && strlen($key)<250)
277 function search($search, $relation, $query, $use_query_andorscore=
false, $id_field=
'id', $name_field=
'name',
278 $count_field=
'count', $cond_field=
'', $more_tables=
'', $more_where=
'', $score_select=
'', $lower=
false)
284 $name_field =
'LOWER('.$this->_table.
'.'.$name_field.
')';
286 $name_field = $this->_table.
'.'.$name_field;
288 $search = mb_strtolower(trim($search));
289 $cond_field2 = $cond_field?$cond_field:$this->_table.
'.'.$id_field;
290 $search_asterix =
'';
293 for ($i=0; $i<strlen($search); $i++)
295 $character = $search[$i];
302 if (!$query[
'having']) {
303 $query[
'having'] =
"1=1";
305 $query[
'having'].=
" AND (name LIKE :insearch OR title LIKE :insearch OR short LIKE :insearch OR content LIKE :insearch OR extra LIKE :insearch)";
306 $query[
'bind'][
'insearch'] =
'%'.$in_search.
'%';
311 $search_asterix.=
'+';
317 $search_asterix.=
'*';
319 $search_asterix.= $character;
321 $in_search.= $character;
322 $search_asterix.=
'+';
327 $in_search.= $character;
329 $search_asterix.= $character;
334 $search_asterix.=
'*';
336 $search = $search_asterix;
338 $search = strtr($search,
'*',
'%');
339 $search = preg_replace(
'/\+ +/',
'+', $search);
340 $search = preg_replace(
'/\- +/',
'-', $search);
341 $parts = explode(
' ', $search);
343 $query_and = array();
345 $query_score = array();
347 foreach($parts as $part)
353 $part = mb_strtolower($part,
'UTF-8');
356 $part = substr($part, 1);
357 $and = $relation.
' IN (SELECT '.$cond_field2.
' FROM '.$this->_table.$more_tables.
358 ' WHERE '.$name_field.
' LIKE :part'.$i.($more_where?
' AND '.$more_where:
'').
')';
359 $query[
'bind'][
'part'.$i] = $part;
360 if ($use_query_andorscore)
362 $query[
'andor'][$part][] = $and;
366 $query_score[] = $name_field.
' LIKE :part'.$i;
367 } elseif ($part[0] ==
'-')
369 $part = substr($part, 1);
370 $and= $relation.
' NOT IN (SELECT '.$cond_field2.
' FROM '.$this->_table.$more_tables.
371 ' WHERE '.$name_field.
' LIKE :part'.$i.($more_where?
' AND '.$more_where:
'').
')';
372 $query[
'bind'][
'part'.$i] = $part;
373 if ($use_query_andorscore)
375 $query[
'and'][] = $and;
382 $like = $name_field.
' LIKE :part'.$i;
383 $query[
'bind'][
'part'.$i] = $part;
384 $part2 = $this->
replace($part);
387 $like2 = $name_field.
' LIKE :parta'.$i;
388 $query[
'bind'][
'parta'.$i] = $part2;
389 $like =
'('.$like.
' OR '.$like2.
')';
391 $part3 = $this->
replace($part,
true);
394 $like3 = $name_field.
' LIKE :partb'.$i;
395 $query[
'bind'][
'partb'.$i] = $part3;
396 $like =
'('.$like.
' OR '.$like3.
')';
398 $query_or[] = $relation.
' IN (SELECT '.$cond_field2.
' FROM '.$this->_table.$more_tables.
399 ' WHERE '.$like.($more_where?
' AND '.$more_where:
'').
')';
400 $query_score[] = $like;
406 $query[
'where'] .=
"\n AND ".join(
' AND ', $query_and);
410 if ($use_query_andorscore)
412 if (is_array($query[
'or']))
414 $query[
'or'] = array_merge($query[
'or'], $query_or);
416 $query[
'or'] = $query_or;
419 $query[
'where'] .=
"\n AND ( (".join(
') OR (', $query_or).
') )';
422 if ($count_field && $query_score)
424 $score =
'(SELECT SUM('.$this->_table.
'.'.$count_field.
') FROM '.$this->_table.
' WHERE '.
425 $relation.
'='.$this->_table.
'.'.$id_field.
' AND ('.join(
' OR ',$query_score).
') GROUP BY '.$this->_table.
'.'.$id_field.
') * '.
426 round(50/
sizeof($query_score)).
' / '.
427 '(SELECT '.$count_field.
' FROM '.$this->_count.
' WHERE '.$this->_count.
'.'.$id_field.
'='.$relation.
')';
428 if ($use_query_andorscore)
430 $query[
'score'][] = $score;
432 $query[
'fields2'][] =
'('.$score.
') AS score';
434 if (!$query[
'order'])
436 $query[
'order'] =
'score DESC';
439 if ($score_select && $query_score)
441 $score = $score_select.
' AND ('.join(
' OR ',$query_score).
') AND '.$relation.
'='.$cond_field2;
443 $query[
'score'] = array($score);
445 if (!$query[
'order'])
447 $query[
'order'] =
'score DESC';
450 if ($this->extraQuery) {
451 if ($query[
'where']) {
452 $query[
'where'] .=
" AND {$this->extraQuery}";
replace($part, $reverse=false)
__construct($table, $suffix='_fulltext')
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)
update($index, $page, $count=array(), $recursive=true)
static getDbDriver($db=null)