Real-life queries, and some scripts to analyze them
[pazpar2-moved-to-github.git] / heikki / queries / process2.pl
1 #!/usr/bin/perl -w
2 # Analyzing DBC's example queries
3 # Step 2: Count identical queries, and query types
4 # Assumes x2 is the result of process1.pl, sorted alphabetically
5
6
7
8 open F, "x2" or die "could not open x2: $!\n";
9
10 open OUT, "| sort -n -r > x3" or die "could not open sort>x3 for writing: $!\n";
11 print OUT "#count ; query \n";
12
13 my $thisquery = "";
14 my $count = 1; # how many times seen the same query
15 my $totalqueries = 0;
16 my $booleans = 0; # queries that contain a boolean operator
17 my $fields = 0; # queries that start with field=, f.ex. title or author
18 my $multifields = 0; # queries that contain more than one field
19 my $simplequeries = 0; # queries without booleans or fields
20 my $uniquequeries = 0;
21 my $singlehits = 0;
22 my $singleterms = 0;
23 my $doubleterms = 0;
24 my $tripleterms = 0;
25 my $manyterms = 0;
26 my %field;
27 while ( <F> ) {
28     next if /^#/;
29     my ( $query, $hits, $pages ) = split (';');
30     next if ( $hits =~ /["a-z]/); # semicolons in original query, ignore
31     if ( $thisquery eq $query ){
32         $count ++;
33     } else {
34         print OUT "$count ; $query \n";
35         $totalqueries += $count;
36         $uniquequeries += 1;
37         $singlehits += 1 if ($hits <= 1 );
38         my $is_simple = 1;
39         my $is_boolean = 0;
40         if ( / og /i || / eller /i || / ikke /i ) {
41             $booleans++;
42             $is_simple = 0;
43             $is_boolean = 1;
44         }
45         if ( $query =~ /^[("]*([^=; \t]+)=(.*)/ ) {
46             my ( $k, $v ) = ( $1, $2);
47             $fields += $count;
48             $is_simple = 0;
49             $multifields += $count if ( $v =~ /=/ ); # multiple fields mentioned
50             if ( $v =~ /=/ && !$is_boolean ) {
51                 print "OOPS: $query\n";
52             }
53             $k = lc($k);
54             $field{$k} = 0 unless defined($field{$k});
55             $field{$k} += $count;
56         } # field query
57         if ($is_simple) {
58             $simplequeries += $count;
59         }
60         my $q2 = $query;
61         $q2 =~ s/\S+=//; # remove fields
62         $q2 =~ s/ og //;
63         $q2 =~ s/ eller //;
64         $q2 =~ s/ ikke //;
65         $singleterms += $count if ($q2 =~ /^\s*\S+\s*$/ );
66         $doubleterms += $count if ($q2 =~ /^\s*\S+\s+\S+\s*$/ );
67         $tripleterms += $count if ($q2 =~ /^\s*\S+\s+\S+\s+\S+\s*$/ );
68         $manyterms   += $count if ($q2 =~ /^\s*\S+\s+\S+\s+\S+\s+\S+/ );
69         #print "$query ; $hits ; $pagecount\n";
70         $count = 1;
71         $thisquery = $query;
72     }
73 }
74 close OUT;
75
76 open OUT, ">x4" or die "could not open x4 for writing summary: $!\n";
77
78 sub line {
79     my ($capt, $number, $dopercent ) = @_;
80     my $percents = "";
81     if ( $dopercent ) {
82         $percents = "". int( $number*1000 / $totalqueries ) / 10 . "%" ;
83     }
84     while (length($percents) < 6 ) { $percents = " $percents"; }
85     print OUT sprintf("%-20s %7d %s\n", $capt, $number, $percents);
86 }
87
88 line "Total queries", $totalqueries, 0;
89 line "Unique queries", $uniquequeries, 1;
90
91 line "Boolean queries",  $booleans, 1;
92 line "Fielded queries",  $fields, 1;
93 line "Multiple fields",  $multifields, 1;
94 line "Simple queries",  $simplequeries, 1;
95 line "One-hit queries", $singlehits, 1;
96 print OUT "\n";
97 line "Single term",  $singleterms, 1;
98 line "Double terms",  $doubleterms, 1;
99 line "Triple terms",  $tripleterms, 1;
100 line "Many terms",  $manyterms, 1;
101
102 print OUT "\nFields\n";
103 for my $k (sort{ $field{$b} <=> $field{$a} } keys(%field) ) {
104     line "  $k", $field{$k}, 1 if ($field{$k} > 100);
105 }