X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSearchUpdate.php;h=3f268b86aba3244fa7cc10cbed4713ceff935f25;hb=45b3ac166d86c7c93d1b2298c733c83ce8b85844;hp=03978bea0461541b90ec1c1acd88372bac9297e4;hpb=46787701ce245af3f5ac15aabea7534d79c78749;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SearchUpdate.php b/includes/SearchUpdate.php index 03978bea04..3f268b86ab 100644 --- a/includes/SearchUpdate.php +++ b/includes/SearchUpdate.php @@ -1,45 +1,65 @@ -mId = $id; - $this->mText = $text; - + function SearchUpdate( $id, $title, $text = false ) { $nt = Title::newFromText( $title ); - $this->mNamespace = $nt->getNamespace(); - $this->mTitle = $nt->getText(); # Discard namespace + if( $nt ) { + $this->mId = $id; + $this->mText = $text; - $this->mTitleWords = $this->mTextWords = array(); + $this->mNamespace = $nt->getNamespace(); + $this->mTitle = $nt->getText(); # Discard namespace + + $this->mTitleWords = $this->mTextWords = array(); + } else { + wfDebug( "SearchUpdate object created with invalid title '$title'\n" ); + } } - function doUpdate() - { + function doUpdate() { global $wgDBminWordLen, $wgLang, $wgDisableSearchUpdate; - if( $wgDisableSearchUpdate ) { + if( $wgDisableSearchUpdate || !$this->mId ) { return false; } - $lc = SearchEngine::legalSearchChars() . "&#;"; + $fname = 'SearchUpdate::doUpdate'; + wfProfileIn( $fname ); + + require_once( 'SearchEngine.php' ); + $lc = SearchEngine::legalSearchChars() . '&#;'; + $db =& wfGetDB( DB_MASTER ); + $searchindex = $db->tableName( 'searchindex' ); + if( $this->mText == false ) { # Just update the title - $sql = "UPDATE LOW_PRIORITY searchindex SET si_title='" . - wfStrencode( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) . + $lowpri = $db->lowPriorityOption(); + $sql = "UPDATE $lowpri $searchindex SET si_title='" . + $db->strencode( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) . "' WHERE si_page={$this->mId}"; - wfQuery( $sql, DB_WRITE, "SearchUpdate::doUpdate" ); + $db->query( $sql, "SearchUpdate::doUpdate" ); + wfProfileOut( $fname ); return; } # Language-specific strip/conversion $text = $wgLang->stripForSearch( $this->mText ); + wfProfileIn( $fname.'-regexps' ); $text = preg_replace( "/<\\/?\\s*[A-Za-z][A-Za-z0-9]*\\s*([^>]*?)>/", - " ", strtolower( " " . $text /*$this->mText*/ . " " ) ); # Strip HTML markup + ' ', strtolower( " " . $text /*$this->mText*/ . " " ) ); # Strip HTML markup $text = preg_replace( "/(^|\\n)\\s*==\\s+([^\\n]+)\\s+==\\s/sD", "\\2 \\2 \\2 ", $text ); # Emphasize headings @@ -65,16 +85,33 @@ class SearchUpdate { $text = preg_replace( "/[^{$lc}]+/", " ", $text ); # Handle 's, s' - $text = preg_replace( "/([{$lc}]+)'s /", "\\1 \\1's ", $text ); - $text = preg_replace( "/([{$lc}]+)s' /", "\\1s ", $text ); + # + # $text = preg_replace( "/([{$lc}]+)'s /", "\\1 \\1's ", $text ); + # $text = preg_replace( "/([{$lc}]+)s' /", "\\1s ", $text ); + # + # These tail-anchored regexps are insanely slow. The worst case comes + # when Japanese or Chinese text (ie, no word spacing) is written on + # a wiki configured for Western UTF-8 mode. The Unicode characters are + # expanded to hex codes and the "words" are very long paragraph-length + # monstrosities. On a large page the above regexps may take over 20 + # seconds *each* on a 1GHz-level processor. + # + # Following are reversed versions which are consistently fast + # (about 3 milliseconds on 1GHz-level processor). + # + $text = strrev( preg_replace( "/ s'([{$lc}]+)/", " s'\\1 \\1", strrev( $text ) ) ); + $text = strrev( preg_replace( "/ 's([{$lc}]+)/", " s\\1", strrev( $text ) ) ); # Strip wiki '' and ''' $text = preg_replace( "/''[']*/", " ", $text ); - - $sql = "REPLACE DELAYED INTO searchindex (si_page,si_title,si_text) VALUES ({$this->mId},'" . - wfStrencode( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) . "','" . - wfStrencode( $text ) . "')"; - wfQuery( $sql, DB_WRITE, "SearchUpdate::doUpdate" ); + wfProfileOut( "$fname-regexps" ); + $db->replace( $searchindex, array(array('si_page')), + array( + 'si_page' => $this->mId, + 'si_title' => $db->strencode( Title::indexTitle( $this->mNamespace, $this->mTitle ) ), + 'si_text' => $db->strencode( $text ) + ), 'SearchUpdate::doUpdate' ); + wfProfileOut( $fname ); } }