PostgreSQL/Tsearch2 full-text-index initial support
authorDomas Mituzas <midom@users.mediawiki.org>
Thu, 25 Nov 2004 14:20:35 +0000 (14:20 +0000)
committerDomas Mituzas <midom@users.mediawiki.org>
Thu, 25 Nov 2004 14:20:35 +0000 (14:20 +0000)
includes/SearchTsearch2.php [new file with mode: 0644]
includes/SpecialSearch.php

diff --git a/includes/SearchTsearch2.php b/includes/SearchTsearch2.php
new file mode 100644 (file)
index 0000000..53b9523
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+# Copyright (C) 2004 Brion Vibber <brion@pobox.com>, Domas Mituzas <domas.mituzas@gmail.com>
+# http://www.mediawiki.org/
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or 
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# http://www.gnu.org/copyleft/gpl.html
+
+/**
+ * Search engine hook for PostgreSQL / Tsearch2
+ * @package MediaWiki
+ * @subpackage Search
+ */
+
+require_once( 'SearchEngine.php' );
+
+class SearchTsearch2 extends SearchEngine {
+       var $strictMatching = false;
+       
+       function SearchTsearch2( &$db ) {
+               $this->db =& $db;
+               $this->db->setSchema('tsearch');
+       }
+       
+       function getIndexField( $fulltext ) {
+               return $fulltext ? 'si_text' : 'si_title';
+       }
+
+       function parseQuery( $filteredText, $fulltext ) {
+               global $wgContLang;
+               $lc = SearchEngine::legalSearchChars();
+               $searchon = '';
+               $this->searchTerms = array();
+
+               # FIXME: This doesn't handle parenthetical expressions.
+               if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+                         $filteredText, $m, PREG_SET_ORDER ) ) {
+                       foreach( $m as $terms ) {
+                               if( $searchon !== '' ) $searchon .= ' ';
+                               if( $this->strictMatching && ($terms[1] == '') ) {
+                                       $terms[1] = '+';
+                               }
+                               $searchon .= $terms[1] . $wgContLang->stripForSearch( $terms[2] );
+                               if( !empty( $terms[3] ) ) {
+                                       $regexp = preg_quote( $terms[3], '/' );
+                                       if( $terms[4] ) $regexp .= "[0-9A-Za-z_]+";
+                               } else {
+                                       $regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
+                               }
+                               $this->searchTerms[] = $regexp;
+                       }
+                       wfDebug( "Would search with '$searchon'\n" );
+                       wfDebug( "Match with /\b" . implode( '\b|\b', $this->searchTerms ) . "\b/\n" );
+               } else {
+                       wfDebug( "Can't understand search query '{$this->filteredText}'\n" );
+               }
+               
+               $searchon = preg_replace('/(\s+)/','&',$searchon);
+               $searchon = $this->db->strencode( $searchon );
+               $field = $this->getIndexField( $fulltext );
+               return " $field @@ to_tsquery('$searchon')";
+       }
+
+       function queryMain( $filteredTerm, $fulltext ) {
+               $match = $this->parseQuery( $filteredTerm, $fulltext );
+               $cur = $this->db->tableName( 'cur' );
+               $searchindex = $this->db->tableName( 'searchindex' );
+               return 'SELECT cur_id, cur_namespace, cur_title, cur_text ' .
+                       "FROM $cur,$searchindex " .
+                       'WHERE cur_id=si_page AND ' . $match;
+       }
+}
+
+?>
index f3fa3e6..d390fb3 100644 (file)
@@ -220,6 +220,9 @@ class SpecialSearch {
                                $class = 'SearchMysql3';
                                require_once( 'SearchMySQL3.php' );
                        }
+               } else if ( $wgDBtype == 'PostgreSQL' ) {
+                       $class = 'SearchTsearch2';
+                       require_once( 'SearchTsearch2.php' );
                } else {
                        $class = 'SearchEngineDummy';
                }