This is the historical archive of the now-inactive 'grubstreet' list.
Discussion on OpenGuides development has now moved to OpenGuides-Dev. Discussion on The Open Guide to London now takes place on OpenGuides-London.

RE: [grubstreet] Ivor's search script

[prev] [thread] [next] [lurker] [Date index for 2002/10/30]

From: Ivor Williams
Subject: RE: [grubstreet] Ivor's search script
Date: 16:44 on 30 Oct 2002
On Tuesday, October 29, 2002 5:30 PM, Earle Martin 
[SMTP:grubstreet@xxxxxxxx.xxx] wrote:
> On Tue, Oct 29, 2002 at 12:05:39AM -0000, Ivor Williams wrote:
> > Is it worthwhile building in the functionality to present matches x at a
> > time?
> > I will look at how to do this, but this may be overkill for Grubstreet.
>
> I think it would be good to be able to do that, because as the site gets
> larger, search results will get longer as well (obviously). For example,
> try searching for 'the'.
>

I have written some code to implement this. 20 results to a page. Over 20 and a 
'More' button appears.

The presentation of the search results is also improved, as only the first 6 
matches on a page are displayed, preventing excess verbosity (but nevertheless 
giving an equal spread of matches between the operands of an AND or OR). The 
results are also ranked, displaying the page with most matches first.

Enjoy.

Ivor.

Patch follows (incremental on the other patch of course):

133c133,134
< 		print hr,h2('Search Results'),start_ol,"\n";
---
> 		my $startpos = $q->param('next') || 0;
> 		print hr,h2('Search Results'),start_ol({start=>$startpos+1}),"\n";
138,139c139,145
< 		for (keys %results) {
< 			print p(li(a({href=>$wikimain."?$_"},b($_)) . br . $results{$_}));
---
> 		my @res_selected = sort {@{$results{$b}} <=> @{$results{$a}}} keys 
%results;
> 		my $tot_results = @res_selected;
> 		splice @res_selected,0,$startpos;
> 		for (@res_selected[0..19]) {
> 			(print end_ol,"\n"),last RESULTS if !$_;
> 			
> 			print p(li(a({href=>$wikimain."?$_"},b($_)),br,@{$results{$_}}[0..5]));
141c147,157
< 		print end_ol,"\n";
---
> 		print end_ol,p($startpos+20,'/',$tot_results,"matches"),"\n";
>
> 		if ($tot_results > $startpos + 20) {
> 			print start_form,
> 				hidden( -name=>'search',
> 					-value=>$srh),
> 				hidden( -name=>'next',
> 					-value=>$startpos + 20),
> 				submit( 'More'),
> 				end_form;
> 		}
161c177
< 		my $out = '';
---
> 		my @out;
168c184
< 			$out .= $match;
---
> 			push @out,$match;
171c187
< 		$res{$k} = $out if $out;
---
> 		$res{$k} = \@out if @out;
176a193,208
> sub intersperse {
> 	my $pagnam = shift;
> 	
> 	my @mixed;
> 	
> 	for my $j (@_) {
> 		if (exists $j->{$pagnam}) {
> 			push @mixed,[$_,$j->{$pagnam}[$_]] for 0..$#{$j->{$pagnam}};
> 		}
> 	}
> 	
> 	my @interspersed = map $_->[1], sort {$a->[0] <=> $b->[0]} @mixed;
> 	
> 	\@interspersed;
> }
>
207c239,240
< 	my %out=%{shift @comby_res};
---
> 	my @out= keys %{$comby_res[0]};
> 	my %out;
212,213c245,246
< 	for my $page (keys %out) {
< 		for (@comby_res) {
---
> 	for my $page (@out) {
> 		for (@comby_res[1..$#comby_res]) {
217c250
< 		$out{$page} .= $_->{$page} for @comby_res;
---
> 		$out{$page} = intersperse($page,@comby_res);
231c264
< 	my %out;
---
> 	my %union;
237c270
< 			$out{$k} .= $v;
---
> 			$union{$k}++;
240a274,277
> 	my %out;
> 	
> 	$out{$_} = intersperse($_,@list_res) for keys %union;
> 	
249c286
< 	my %out = map {$_=>''} keys %wikitext;
---
> 	my %out = map {$_=>[]} keys %wikitext;



-- 
grubstreet mailing list
http://london.openguides.org/old-list-archives/