1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-08-01 14:30:32 +02:00

- added a UNIQUE index on the wordmatch table

- some modifications of search indexing which might improve the speed and hopefully fixes [Bug #8352]
- added logging to search indexing [Bug #8384]


git-svn-id: file:///svn/phpbb/trunk@7119 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
Nils Adermann
2007-03-04 16:05:17 +00:00
parent 567b01302b
commit ac21b7d47b
13 changed files with 57 additions and 28 deletions

View File

@@ -8,16 +8,6 @@
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
// make sure, a start time is saved
still_on_time();
/**
* @package acp
*/
@@ -27,7 +17,7 @@ class acp_search
var $state;
var $search;
var $max_post_id;
var $batch_size = 1000;
var $batch_size = 100;
function main($id, $mode)
{
@@ -260,6 +250,7 @@ class acp_search
{
trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);
}
$name = ucfirst(strtolower(str_replace('_', ' ', $this->state[0])));
$action = &$this->state[1];
@@ -284,12 +275,15 @@ class acp_search
}
else
{
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$row_count = 0;
while (still_on_time() && $post_counter <= $this->max_post_id)
{
$sql = 'SELECT post_id, poster_id, forum_id
FROM ' . POSTS_TABLE . '
WHERE post_id >= ' . (int) ($post_counter + 1) . '
AND post_id < ' . (int) ($post_counter + $this->batch_size);
AND post_id <= ' . (int) ($post_counter + $this->batch_size);
$result = $db->sql_query($sql);
$ids = $posters = $forum_ids = array();
@@ -300,6 +294,7 @@ class acp_search
$forum_ids[] = $row['forum_id'];
}
$db->sql_freeresult($result);
$row_count += sizeof($ids);
if (sizeof($ids))
{
@@ -307,15 +302,17 @@ class acp_search
}
$post_counter += $this->batch_size;
// save the current state
$this->save_state();
}
// save the current state
$this->save_state();
if ($post_counter <= $this->max_post_id)
{
$mtime = explode(' ', microtime());
$totaltime = $mtime[0] + $mtime[1] - $starttime;
$rows_per_second = $row_count / $totaltime;
meta_refresh(1, $this->u_action . '&amp;action=delete&amp;skip_rows=' . $post_counter);
trigger_error(sprintf($user->lang['SEARCH_INDEX_DELETE_REDIRECT'], $post_counter));
trigger_error(sprintf($user->lang['SEARCH_INDEX_DELETE_REDIRECT'], $post_counter, $row_count, $rows_per_second));
}
}
@@ -324,6 +321,7 @@ class acp_search
$this->state = array('');
$this->save_state();
add_log('admin', 'LOG_SEARCH_INDEX_REMOVED', $name);
trigger_error($user->lang['SEARCH_INDEX_REMOVED'] . adm_back_link($this->u_action) . $this->close_popup_js());
break;
@@ -350,12 +348,15 @@ class acp_search
}
$db->sql_freeresult($result);
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$row_count = 0;
while (still_on_time() && $post_counter <= $this->max_post_id)
{
$sql = 'SELECT post_id, post_subject, post_text, poster_id, forum_id
FROM ' . POSTS_TABLE . '
WHERE post_id >= ' . (int) ($post_counter + 1) . '
AND post_id < ' . (int) ($post_counter + $this->batch_size);
AND post_id <= ' . (int) ($post_counter + $this->batch_size);
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
@@ -366,19 +367,29 @@ class acp_search
{
$this->search->index('post', $row['post_id'], $row['post_text'], $row['post_subject'], $row['poster_id'], $row['forum_id']);
}
$row_count++;
}
$db->sql_freeresult($result);
$post_counter += $this->batch_size;
// save the current state
$this->save_state();
}
// save the current state
$this->save_state();
// pretend the number of posts was as big as the number of ids we indexed so far
// just an estimation as it includes deleted posts
$num_posts = $config['num_posts'];
$config['num_posts'] = min($config['num_posts'], $post_counter);
$this->search->tidy();
$config['num_posts'] = $num_posts;
if ($post_counter <= $this->max_post_id)
{
$mtime = explode(' ', microtime());
$totaltime = $mtime[0] + $mtime[1] - $starttime;
$rows_per_second = $row_count / $totaltime;
meta_refresh(1, $this->u_action . '&amp;action=create&amp;skip_rows=' . $post_counter);
trigger_error(sprintf($user->lang['SEARCH_INDEX_CREATE_REDIRECT'], $post_counter));
trigger_error(sprintf($user->lang['SEARCH_INDEX_CREATE_REDIRECT'], $post_counter, $row_count, $rows_per_second));
}
}
@@ -387,6 +398,7 @@ class acp_search
$this->state = array('');
$this->save_state();
add_log('admin', 'LOG_SEARCH_INDEX_CREATED', $name);
trigger_error($user->lang['SEARCH_INDEX_CREATED'] . adm_back_link($this->u_action) . $this->close_popup_js());
break;
}

View File

@@ -180,7 +180,7 @@ function unique_id($extra = 'c')
* @return bool Either true if the maximum execution time is nearly reached, or false
* if some time is still left.
*/
function still_on_time()
function still_on_time($extra_time = 15)
{
static $max_execution_time, $start_time;
@@ -194,10 +194,10 @@ function still_on_time()
// If zero, then set to something higher to not let the user catch the ten seconds barrier.
if ($max_execution_time === 0)
{
$max_execution_time = 65;
$max_execution_time = 50 + $extra_time;
}
$max_execution_time = min(max(10, ($max_execution_time - 15)), 50);
$max_execution_time = min(max(10, ($max_execution_time - $extra_time)), 50);
// For debugging purposes
// $max_execution_time = 10;

View File

@@ -1110,7 +1110,6 @@ class fulltext_native extends search_backend
$word_ids[$row['word_text']] = $row['word_id'];
}
$db->sql_freeresult($result);
$new_words = array_diff($unique_add_words, array_keys($word_ids));
if (sizeof($new_words))
@@ -1121,8 +1120,9 @@ class fulltext_native extends search_backend
{
$sql_ary[] = array('word_text' => $word);
}
$db->return_on_error = true;
$db->sql_multi_insert(SEARCH_WORDLIST_TABLE, $sql_ary);
$db->return_on_error = false;
}
unset($new_words, $sql_ary);
}
@@ -1149,6 +1149,7 @@ class fulltext_native extends search_backend
}
}
$db->return_on_error = true;
foreach ($words['add'] as $word_in => $word_ary)
{
$title_match = ($word_in == 'title') ? 1 : 0;
@@ -1162,6 +1163,7 @@ class fulltext_native extends search_backend
$db->sql_query($sql);
}
}
$db->return_on_error = false;
// destroy cached search results containing any of the words removed or added
$this->destroy_cache(array_unique(array_merge($words['add']['post'], $words['add']['title'], $words['del']['post'], $words['del']['title'])), array($poster_id));