9590695f9f679e9ed0bce099fa061a1bdbd4a06f
[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 27)
29   if ($check = search_check_php5()) {  
30     require_once("$CFG->dirroot/search/Zend/Search/Lucene.php");
31     
32     $query_string = optional_param('query_string', '', PARAM_CLEAN);
33     $page_number  = optional_param('page', 1, PARAM_INT);
34     
35     if ($page_number < 1) {
36       $page_number = 1;
37     } //if
38         
39     $index_path = "$CFG->dataroot/search";
40     $no_index = false; //optimism!
41     $results_per_page = 10;
42     
43     try {
44       $index = new Zend_Search_Lucene($index_path, false);
45     } catch(Exception $e) {
46       //print $e;
47       $no_index = true;
48     } //catch
49   } //if  
50   
51   if (!$site = get_site()) {
52     redirect("index.php");
53   } //if
54     
55   $strsearch = "Search"; //get_string();
56   $strquery  = "Enter your search query"; //get_string();
58   print_header("$site->shortname: $strsearch: $strquery", "$site->fullname", 
59                "<a href=\"index.php\">$strsearch</a> -> $strquery");
60   
61   //keep things pretty, even if php5 isn't available
62   if (!$check) {
63     print_heading(search_check_php5(true));
64     print_footer();
65     exit(0);
66   } //if
67   
68   print_simple_box_start('center', '100%', '', 20);
69   print_heading($strquery);
70   
71   print_simple_box_start('center', '', '', 20);
72   
73 ?>
75 <form name="query" method="get" action="query.php">
76   <input type="text" name="query_string" length="50" value="<?php print stripslashes(htmlentities($query_string)) ?>"/>
77   &nbsp;<input type="submit" value="Search"/>&nbsp;&nbsp;<a href="query.php?advanced=yes">Advanced search</a>
78   <a href="stats.php">Statistics</a>
79 </form>
81 <br>
83 <div align="center">
84 <?php
85 echo 'Searching: ';
87 if ($no_index) {
88   print "0";
89 } else {
90   print $index->count();
91 } //else
93 print ' documents.';
95 if ($no_index and isadmin()) {
96   print "<br><br>Admin: There appears to be no index, click <a href='indexersplash.php'>here</a> to create one.";
97 } //if
98 ?>
99 </div>
101 <?php  
102   print_simple_box_end();
103   
104   if (!empty($query_string) and !$no_index) {
105     print_simple_box_start('center', '50%', 'white', 10);
106     
107     search_stopwatch();
108     $hits = $index->find(strtolower($query_string));
109     $hit_count = count($hits);
110     
111     print "<br>";
113     print $hit_count." results returned for '".stripslashes($query_string)."'.";
114     print "<br>";
115       
116     if ($hit_count > 0) {                        
117       if ($hit_count < $results_per_page) {
118         $page_number = 1;
119       } else if ($page_number > ceil($hit_count/$results_per_page)) {
120         $page_number = $hit_count/$results_per_page;
121       } //if
122     
123       $start = ($page_number - 1)*$results_per_page;
124       $end = $start + $results_per_page;
125         
126       print "<ol>";
127         
128       for ($i = $start; $i < $end; $i++) {
129         if ($i >= $hit_count) {
130           break;
131         } //if
132       
133         $listing = $hits[$i];
134       
135         print "<li value='".($i+1)."'><a href='".$listing->url."'>$listing->title</a><br>\n"
136              ."<em>".search_shorten_url($listing->url, 70)."</em><br>\n"        
137              ."Type: ".$listing->doctype.", score: ".round($listing->score, 3).", author: ".$listing->author."<br>\n"            
138              ."<br></li>\n";
139       } //for
140       
141       print "</ol>";
142     } //if
143     
144     print "<div align='center'>";
145     
146     if ($page_number > 1) {
147       print "<a href='query.php?query_string=$query_string&page=".($page_number-1)."'>< Back</a>&nbsp;";
148     } else {
149       print "< Back&nbsp;";
150     } //else
151     
152     for ($i = 1; $i <= ceil($hit_count/$results_per_page); $i++) {
153       if ($page_number == $i) {
154         print "[$i]&nbsp;";
155       } else {
156         print "<a href='query.php?query_string=$query_string&page=$i'>$i</a>&nbsp;";
157       } //else
158     } //for
159     
160     if ($page_number < ceil($hit_count/$results_per_page)) {      
161       print "<a href='query.php?query_string=$query_string&page=".($page_number+1)."'>Next ></a>&nbsp;";
162     } else {
163       print "Next >&nbsp;";
164     } //else
165     
166     print "</div>";
167     
168     print_simple_box_end();
169   } //if
170   
171   if (!empty($query_string) and !$no_index) {
172 ?>
174 <div align="center">
175   It took <?php search_stopwatch(); ?> to fetch these results.
176 </div>
178 <?php
179   } //if
180   
181   print_simple_box_end();
182   print_footer();
183 ?>