Advanced search page added.
[moodle.git] / search / query.php
1 <?php
3   /* The query page - accepts a user-entered query string and returns results.
4    *
5    * Queries are boolean-aware, e.g.:
6    * 
7    * '+'      term required
8    * '-'      term must not be present
9    * ''       (no modifier) term's presence increases rank, but isn't required
10    * 'field:' search this field
11    *
12    * Examples:
13    *
14    * 'earthquake +author:michael'
15    *   Searches for documents written by 'michael' that contain 'earthquake'
16    *
17    * 'earthquake +doctype:wiki'
18    *   Search all wiki pages for 'earthquake'
19    *
20    * '+author:helen +author:foster'
21    *   All articles written by Helen Foster
22    *   
23    * */
25   require_once('../config.php');
26   require_once("$CFG->dirroot/search/lib.php"); 
27     
28   //check for php5, but don't die yet (see line 52)
29   if ($check = search_check_php5()) {      
30     require_once("$CFG->dirroot/search/querylib.php");    
31     
32     $advanced     = (optional_param('a', '0', PARAM_INT) == '1') ? true : false;   
33     $pages        = (optional_param('p', '0', PARAM_INT) == '1') ? true : false;
34     $query_string = optional_param('query_string', '', PARAM_CLEAN); 
35       
36     if ($pages && isset($_SESSION['search_advanced_query'])) {
37       $adv = unserialize($_SESSION['search_advanced_query']);
38     } else if ($advanced) {
39       unset($_SESSION['search_advanced_query']);
40       session_unregister('search_advanced_query');
41             
42       $adv->mustappear  = trim(optional_param('mustappear', '', PARAM_CLEAN), $chars);
43       $adv->notappear   = trim(optional_param('notappear', '', PARAM_CLEAN), $chars);
44       $adv->canappear   = trim(optional_param('canappear', '', PARAM_CLEAN), $chars);
45       $adv->module      = optional_param('module', '', PARAM_CLEAN);
46       $adv->title       = trim(optional_param('title', '', PARAM_CLEAN), $chars);
47       $adv->author      = trim(optional_param('author', '', PARAM_CLEAN), $chars);
48     } //else      
49     
50     if ($advanced) {
51       $chars = ' \t\n\r\0\x0B,;';
52       $query_string = '';      
53       
54       $module_types = array_merge(array('All'), array_values(search_get_document_types()));      
55       $adv->module = in_array($adv->module, $module_types) ? $adv->module : 'All';
56       
57       if (strlen(trim($adv->mustappear)) > 0) {
58         $query_string  = ' +'.implode(' +', preg_split("/[\s,;]+/", $adv->mustappear));
59       } //if
60       
61       if (strlen(trim($adv->notappear)) > 0) {
62         $query_string .= ' -'.implode(' -', preg_split("/[\s,;]+/", $adv->notappear));
63       } //if
64       
65       if (strlen(trim($adv->canappear)) > 0) { 
66         $query_string .= ' '.implode(' ', preg_split("/[\s,;]+/", $adv->canappear));
67       } //if
68       
69       if ($adv->module != 'All') {
70         $query_string .= ' +doctype:'.$adv->module;
71       } //if
72       
73       if (strlen(trim($adv->title)) > 0) {
74         $query_string .= ' +title:'.implode(' +title:', preg_split("/[\s,;]+/", $adv->title));
75       } //if
76       
77       if (strlen(trim($adv->author)) > 0) {
78         $query_string .= ' +author:'.implode(' +author:', preg_split("/[\s,;]+/", $adv->author));
79       } //if     
80       
81       if (!empty($query_string)) {
82         $_SESSION['search_advanced_query'] = serialize($adv);
83       } //if 
84     } //if
85     
86     $page_number  = optional_param('page', 1, PARAM_INT);        
87     
88     if ($page_number < 1) {
89       $page_number = 1;
90     } //if
91     
92     $sq = new SearchQuery($query_string, $page_number, 10, true);  
93   } //if
94   
95   if (!$site = get_site()) {
96     redirect("index.php");
97   } //if
98     
99   $strsearch = "Search"; //get_string();
100   $strquery  = "Enter your search query"; //get_string();
102   print_header("$site->shortname: $strsearch: $strquery", "$site->fullname", 
103                "<a href=\"index.php\">$strsearch</a> -> $strquery");
104   
105   //keep things pretty, even if php5 isn't available
106   if (!$check) {
107     print_heading(search_check_php5(true));
108     print_footer();
109     exit(0);
110   } //if
111   
112   print_simple_box_start('center', '100%', '', 20);
113   print_heading($strquery);
114   
115   print_simple_box_start('center', '', '', 20);
116       
117   $vars = get_object_vars($adv);
118   
119   foreach ($vars as $key => $value) {
120     $adv->$key = stripslashes(htmlentities($value));
121   } //foreach  
122   
123 ?>
125 <form name="query" method="get" action="query.php">
126   <?php if (!$advanced) { ?>
127     <input type="text" name="query_string" length="50" value="<?php print stripslashes(htmlentities($query_string)) ?>"/>
128     &nbsp;<input type="submit" value="Search"/>&nbsp;&nbsp; 
129     <a href="query.php?a=1">Advanced search</a>
130     <a href="stats.php">Statistics</a>
131   <?php } else {
132     print_simple_box_start('center', '', 'white', 10);    
133   ?>    
134     <input type="hidden" name="a" value="<?php print $advanced; ?>"/>
135      
136     <table border="0" cellpadding="3" cellspacing="3">
137     
138     <tr>
139       <td width="240">These words must appear:</td>
140       <td><input type="text" name="mustappear" length="50" value="<?php print $adv->mustappear; ?>"/></td>
141     </tr>
142     
143     <tr>
144       <td>These words must not appear:</td>
145       <td><input type="text" name="notappear" length="50" value="<?php print $adv->notappear; ?>"/></td>
146     </tr>
148     <tr>
149       <td>These words help improve rank:</td>
150       <td><input type="text" name="canappear" length="50" value="<?php print $adv->canappear; ?>"/></td>
151     </tr>    
152     
153     <tr>
154       <td>Which modules to search?:</td>
155       <td>
156         <select name="module">          
157           <?php foreach($module_types as $mod) {
158             if ($mod == $adv->module) {
159               print "<option value='$mod' selected>$mod</option>\n";
160             } else {
161               print "<option value='$mod'>$mod</option>\n";
162             } //else
163           } ?>
164         </select>
165       </td>
166     </tr>
167     
168     <tr>
169       <td>Words in title:</td>
170       <td><input type="text" name="title" length="50" value="<?php print $adv->title; ?>"/></td>
171     </tr>
172     
173     <tr>
174       <td>Author name:</td>
175       <td><input type="text" name="author" length="50" value="<?php print $adv->author; ?>"/></td>
176     </tr>
177     
178     <tr>
179       <td colspan="3" align="center"><br><input type="submit" value="Search"/></td>
180     </tr>
181     
182     <tr>
183       <td colspan="3" align="center">
184         <table border="0" cellpadding="0" cellspacing="0">
185           <tr>
186             <td><a href="query.php">Normal search</a>&nbsp;</td>
187             <td>&nbsp;<a href="stats.php">Statistics</a></td>
188           </tr>
189         </table>
190       </td>
191     </tr>
192     </table>           
193   <?php
194     print_simple_box_end();
195   } //if
196   ?>
197 </form>
199 <br>
201 <?php
203   print '<div align="center">';
204   print 'Searching: ';
205   
206   if ($sq->is_valid_index()) {
207     print $sq->index_count();    
208   } else {
209     print "0";
210   } //else
211   
212   print ' documents.';
213   
214   if (!$sq->is_valid_index() and isadmin()) {
215     print "<br><br>Admin: There appears to be no index, click <a href='indexersplash.php'>here</a> to create one.";
216   } //if
218   print '</div>';
220   print_simple_box_end();
221   
222   if ($sq->is_valid()) {
223     print_simple_box_start('center', '50%', 'white', 10);
224     
225     search_stopwatch();              
226     $hit_count = $sq->count();    
227     
228     print "<br>";
230     print $hit_count." results returned for '".stripslashes($query_string)."'.";
231     print "<br>";
232       
233     if ($hit_count > 0) {     
234       $page_links = $sq->page_numbers();     
235       $hits       = $sq->results();
236       
237       if ($advanced) {
238         $page_links = preg_replace("/query_string=[^&]+/", 'a=1&p=1', $page_links);
239       } //if
240         
241       print "<ol>";
242         
243       foreach ($hits as $listing) {
244         print "<li value='".($listing->number+1)."'><a href='".$listing->url."'>$listing->title</a><br>\n"
245              ."<em>".search_shorten_url($listing->url, 70)."</em><br>\n"        
246              ."Type: ".$listing->doctype.", score: ".round($listing->score, 3).", author: ".$listing->author."<br>\n"            
247              ."<br></li>\n";
248       } //for
249       
250       print "</ol>";
251       print $page_links;
252     } //if        
253     
254     print_simple_box_end();
255 ?>
257 <div align="center">
258   It took <?php search_stopwatch(); ?> to fetch these results.
259 </div>
261 <?php
262   } //if (sq is valid)
263   
264   print_simple_box_end();
265   print_footer();
266 ?>