Merge git://git.koha.org/pub/scm/koha
authorGalen Charlton <galen.charlton@liblime.com>
Tue, 18 Dec 2007 23:46:54 +0000 (17:46 -0600)
committerGalen Charlton <galen.charlton@liblime.com>
Tue, 18 Dec 2007 23:46:54 +0000 (17:46 -0600)
1  2 
C4/Search.pm
etc/zebradb/marc_defs/marc21/biblios/record.abs

diff --combined C4/Search.pm
@@@ -158,7 -158,7 +158,7 @@@ this function performs a simple search 
  =item C<input arg:>
  
      * $query could be a simple keyword or a complete CCL query wich is depending on your ccl file.
 -    * @servers is optionnal. default one is read on koha.xml
 +    * @servers is optionnal. default one is read on koha-conf.xml
  
  =item C<Output arg:>
      * $error is a string which containt the description error if there is one. Else it's empty.
@@@ -429,8 -429,8 +429,8 @@@ sub getRecords 
                          my $tmprecord = MARC::Record->new();
                          $tmprecord->encoding('UTF-8');
                          my $tmptitle;
-                       # srote the minimal record in author/title (depending on MARC flavour)
+                                               my $tmpauthor;
+                       # the minimal record in author/title (depending on MARC flavour)
                          if ( C4::Context->preference("marcflavour") eq
                              "UNIMARC" )
                          {
                              );
                          }
                          else {
-                             $tmptitle = MARC::Field->new(
-                                 '245', ' ', ' ',
-                                 a => $term,
-                                 b => $occ
-                             );
+                             $tmptitle = MARC::Field->new('245', ' ', ' ',a => $term,);
+                                                       $tmpauthor = MARC::Field->new('100', ' ', ' ',a => $occ,);
                          }
                          $tmprecord->append_fields($tmptitle);
-                         $results_hash->{'RECORDS'}[$j] =
-                           $tmprecord->as_usmarc();
+                                               $tmprecord->append_fields($tmpauthor);
+                         $results_hash->{'RECORDS'}[$j] = $tmprecord->as_usmarc();
                      }
                      else {
                          $record = $results[ $i - 1 ]->record($j)->raw();
@@@ -660,8 -657,10 +657,10 @@@ sub _build_weighted_query 
          $weighted_query .= " or ti,phr,r3=\"$operand\"";            # phrase title
         #$weighted_query .= " or any,ext,r4=$operand";               # exact any
         #$weighted_query .=" or kw,wrdl,r5=\"$operand\"";            # word list any
-         $weighted_query .= " or wrd,fuzzy,r8=\"$operand\"" if $fuzzy_enabled; # add fuzzy, word list
-         $weighted_query .= " or wrd,right-Truncation,r9=\"$stemmed_operand\"" if ($stemming and $stemmed_operand); # add stemming, right truncation
+         $weighted_query .= " or wrdl,fuzzy,r8=\"$operand\"" if $fuzzy_enabled; # add fuzzy, word list
+         $weighted_query .= " or wrdl,right-Truncation,r9=\"$stemmed_operand\"" if ($stemming and $stemmed_operand); # add stemming, right truncation
+               $weighted_query .= " or wrdl,r9=\"$operand\"";
         # embedded sorting: 0 a-z; 1 z-a
         # $weighted_query .= ") or (sort1,aut=1";
      }
         $weighted_query .= " $index,ext,r1=\"$operand\"";            # exact index
         #$weighted_query .= " or (title-sort-az=0 or $index,startswithnt,st-word,r3=$operand #)";
         $weighted_query .= " or $index,phr,r3=\"$operand\"";         # phrase index
-        $weighted_query .= " or $index,rt,wrd,r3=\"$operand\"";      # word list index
+        $weighted_query .= " or $index,rt,wrdl,r3=\"$operand\"";      # word list index
      }
      $weighted_query .= "))";    # close rank specification
      return $weighted_query;
@@@ -751,7 -750,8 +750,8 @@@ sub buildQuery 
  
                                # a flag to determine whether or not to add the index to the query
                                my $indexes_set;
-                               # if the user is sophisticated enough to specify an index, turn off some defaults
+                               # if the user is sophisticated enough to specify an index, turn off field weighting, stemming, and stopword handling
                                if ($operands[$i] =~ /(:|=)/ || $scan) {
                                        $weight_fields = 0;
                                        $stemming = 0;
                  my $operand = $operands[$i];
                  my $index   = $indexes[$i];
  
+                               # add some attributes for certain index types
+                               # Date of Publication
+                               if ($index eq 'yr') {
+                                       $index .=",st-numeric";
+                                       $indexes_set++;
+                                       ($stemming,$auto_truncation,$weight_fields, $fuzzy_enabled, $remove_stopwords) = (0,0,0,0,0);
+                               }
+                               # Date of Acquisition
+                               elsif ($index eq 'acqdate') {
+                                       $index.=",st-date-normalized";
+                                       $indexes_set++;
+                                       ($stemming,$auto_truncation,$weight_fields, $fuzzy_enabled, $remove_stopwords) = (0,0,0,0,0);
+                               }
+                               # set default structure attribute (word list)
+                               my $struct_attr;
+                               unless (!$index || $index =~ /(st-|phr|ext|wrdl)/) {
+                                       $struct_attr = ",wrdl";
+                               }
                                # some helpful index modifs
-                 my $index_plus = "$index:" if $index;
-                 my $index_plus_comma="$index," if $index;
+                 my $index_plus = $index.$struct_attr.":" if $index;
+                 my $index_plus_comma=$index.$struct_attr."," if $index;
  
                  # Remove Stopwords
                                if ($remove_stopwords) {
                        $limit_desc .=" or " if $group_OR_limits;
                        $group_OR_limits .= "$this_limit";
                        $limit_cgi .="&limit=$this_limit";
-                       $limit_desc .= "$this_limit";
+                       $limit_desc .= " $this_limit";
          }
                # regular old limits
                else {
                        $limit .= " and " if $limit || $query;
                        $limit .= "$this_limit";
                        $limit_cgi .="&limit=$this_limit";
-                       $limit_desc .=" and $this_limit";
+                       $limit_desc .=" $this_limit";
                }
      }
        if ($group_OR_limits) {
@@@ -1033,19 -1052,28 +1052,28 @@@ sub searchResults 
          }
          # add spans to search term in results for search term highlighting
          # save a native author, for the <a href=search.lq=<!--tmpl_var name="author"-->> link
+               my $searchhighlightblob;
+               for my $highlight_field ($marcrecord->fields) {
+                       next if $highlight_field->tag() =~ /(^00)/; # skip fixed fields
+                       my $match;
+                       my $field = $highlight_field->as_string();
+                       for my $term ( keys %$span_terms_hashref ) {
+                               if (($field =~ /$term/i) && (length($term) > 3)) {
+                                       $field =~ s/$term/<span class=\"term\">$&<\/span>/gi;
+                                       $match++;
+                               }
+                       }
+                       $searchhighlightblob .= $field." ... " if $match;
+               }
+               $oldbiblio->{'searchhighlightblob'} = $searchhighlightblob;
          $oldbiblio->{'author_nospan'} = $oldbiblio->{'author'};
-         foreach my $term ( keys %$span_terms_hashref ) {
+         for my $term ( keys %$span_terms_hashref ) {
              my $old_term = $term;
              if ( length($term) > 3 ) {
-                 $term =~ s/(.*=|\)|\(|\+|\.|\?|\[|\])//g;
-                 $term =~ s/\\//g;
-                 $term =~ s/\*//g;
-                 #FIXME: is there a better way to do this?
+                 $term =~ s/(.*=|\)|\(|\+|\.|\?|\[|\]|\\|\*)//g;
                  $oldbiblio->{'title'} =~ s/$term/<span class=\"term\">$&<\/span>/gi;
-                 $oldbiblio->{'subtitle'} =~
-                   s/$term/<span class=\"term\">$&<\/span>/gi;
+                 $oldbiblio->{'subtitle'} =~ s/$term/<span class=\"term\">$&<\/span>/gi;
                  $oldbiblio->{'author'} =~ s/$term/<span class=\"term\">$&<\/span>/gi;
                  $oldbiblio->{'publishercode'} =~ s/$term/<span class=\"term\">$&<\/span>/gi;
                  $oldbiblio->{'place'} =~ s/$term/<span class=\"term\">$&<\/span>/gi;
@@@ -1323,7 -1351,7 +1351,7 @@@ sub NZanalyse 
          $left='subject' if $left =~ '^su$';
          $left='koha-Auth-Number' if $left =~ '^an$';
          $left='keyword' if $left =~ '^kw$';
-         if ($operator) {
+         if ($operator && $left  ne 'keyword' ) {
              #do a specific search
              my $dbh = C4::Context->dbh;
              $operator='LIKE' if $operator eq '=' and $right=~ /%/;
                  }
              }
          } else {
-             #do a complete search (all indexes)
+             #do a complete search (all indexes), if index='kw' do complete search too.
              my $dbh = C4::Context->dbh;
              my $sth = $dbh->prepare("SELECT biblionumbers FROM nozebra WHERE server=? AND value LIKE ?");
              # split each word, query the DB and build the biblionumbers result
index a51c029,0000000..775fcc1
mode 100644,000000..100644
--- /dev/null
@@@ -1,282 -1,0 +1,288 @@@
 +# This is a fairly simple example of a set of MARC21 indexing rules. It
 +# results in a server which provides a passable Bath level 0 and 1 service
 +# (author, title, subject, keyword and exact services). Feel free to
 +# elaborate on it, and if you do, please consider sharing your additions.
 +# NOTE: This is designed to be used with the grs.marcxml input filter
 +# for ISO2709 (ANSI Z39.2) or grs.xml for MARCXML-formatted records. It
 +# won't work for the old grs.marc input filter, which yields a different
 +# internal structure.
 +encoding utf-8
 +name marc21
 +attset bib1.att
 +attset gils.att
 +esetname F @
 +esetname B @
 +
 +marc usmarc.mar
 +systag sysno rank
 +xpath enable
- melm 005              Date,Date/time-last-modified
++# Some notes:
 +# pl = Published Place
 +# ta = Target Audience 002/22
 +# ff8-23
 +# lf = Literary Form 008/33
 +# bio = Biography 008/34
 +# fmt = Format
 +# ln = Language
 +# ctype = Content type: review, catalog, encyclopedia, dictionary
 +# pubdate Publication Date
 +# rtype =  Record type (leader 06)
++#
++# Date indexing in Koha 3.0 for MARC21:
++# Index                   Expected format         Notes
++# date-entered-on-file    [yymmdd]        (008/0-5, indexed in word and sort indexes)
++# copydate                [yyyy]          (260$c, indexed in word and sort indexes)
++# acqdate                 [yyyy-mm-dd]    (952$d, indexed in date,word,sort indexes)
++# pubdate                 [yyyy]          (008/7-10, indexed in year,word,num,sort indexes)
 +
 +all any
 +# melm 000            rtype:n:range(data,06,1),Bib-level:w:range(data,07,01)
 +xelm /record/leader llength:w:range(data,0,5),rtype:w:range(data,6,1),Bib-level:w:range(data,7,1)
 +# example: xelm /record/leader l1:w:range(data,0,5),l2:w:range(data,10,2)
 +
 +melm 001              Control-number
- melm 008              ln:n:range(data,35,3),ctype:w:range(data,24,4),Date:n:range(data,0,5),Date:s:range(data,0,5),Date:n:range(data,7,4),Date:s:range(data,7,4),Date:n:range(data,11,4),Date:s:range(data,11,4),pubdate:n:range(data,7,4),pubdate:s:range(data,7,4),dateaddeddb:n:range(data,0,5),dateaddeddb:s:range(data,0,5),pl:w:range(data,15,3),ta:w:range(data,22,1),ff8-23:w:range(data,23,1),ff8-29:w:range(data,29,1),lf:w:range(data,33,1),bio:w:range(data,34,1),Record-source:w:range(data,39,0)
++melm 005              Date/time-last-modified
 +melm 007              Microform-generation:n:range(data,11,1),Material-type,ff7-00:w:range(data,0,1),ff7-01:w:range(data,1,1),ff7-02:w:range(data,2,1),ff7-01-02:w:range(data,0,2)
 +
- melm 033              Date
++melm 008              date-entered-on-file:n:range(data,0,5),date-entered-on-file:s:range(data,0,5),pubdate:w:range(data,7,4),pubdate:n:range(data,7,4),pubdate:y:range(data,7,4),pubdate:s:range(data,7,4),pl:w:range(data,15,3),ta:w:range(data,22,1),ff8-23:w:range(data,23,1),ff8-29:w:range(data,29,1),lf:w:range(data,33,1),bio:w:range(data,34,1),ln:n:range(data,35,3),ctype:w:range(data,24,4),Record-source:w:range(data,39,0)
 +
 +melm 010              LC-card-number,Identifier-standard
 +melm 011              LC-card-number,Identifier-standard
 +melm 015              BNB-card-number,BGF-number,Number-db,Number-natl-biblio,Identifier-standard
 +melm 017              Number-legal-deposit,Identifier-standard
 +melm 018              Identifier-standard
 +melm 020$a      ISBN:w,Identifier-standard:w
 +melm 020              ISBN,Identifier-standard
 +melm 022$a      ISSN:w,ISBN:w
 +melm 022              ISSN,Identifier-standard
 +melm 023              Identifier-standard
 +melm 024              Identifier-standard
 +melm 025              Identifier-standard
 +melm 027              Report-number,Identifier-standard
 +melm 028              Number-music-publisher,Identifier-standard
 +melm 030              CODEN,Identifier-standard
- melm 260$c            Date,Date:s,Date:y
- #,pubdate,pubdate:s
++#melm 033             Date
 +melm 034        Map-scale
 +#melm 035             Local-number,Identifier-standard
 +melm 037              Identifier-standard,Stock-number
 +melm 040        Code-institution,Record-source
 +melm 041        ln
 +melm 043        Code-geographic
 +#melm 046             pubdate
 +melm 050$b            LC-call-number:w, LC-call-number:p, LC-call-number:s
 +melm 050              LC-call-number:w, LC-call-number:p, LC-call-number:s
 +melm 052              Geographic-class
 +melm 060              NLM-call-number
 +melm 070              NAL-call-number
 +melm 080              UDC-classification
 +melm 082        Dewey-classification:w,Dewey-classification:s
 +melm 086        Number-govt-pub
 +#melm 942$k           LC-card-number:s
 +
 +## KOHA SPECIFIC
 +#melm 090$c           Local-number:w
 +#Identifier-standard:w
 +
 +melm 100$9            Cross-Reference:w,Koha-Auth-Number
 +melm 100$a            Author,Author:p,Author:s,Editor,Author-personal-bibliography,Author-personal-bibliography:p,Author-personal-bibliography:s
 +melm 100              Author,Author-title,Author-name-personal,Name,Name-and-title,Personal-name
 +melm 110$9      Koha-Auth-Number
 +melm 110              Author,Author-title,Author-name-corporate,Name,Name-and-title,Corporate-name
 +melm 111$9      Koha-Auth-Number
 +melm 111              Author,Author-title,Author-name-corporate,Name,Name-and-title,Conference-name
 +melm 130$n            Thematic-number
 +melm 130$r            Music-key
 +melm 130$9      Koha-Auth-Number
 +melm 130              Title,Title-uniform
 +
 +melm 210              Title,Title-abbreviated
 +melm 211              Title,Title-abbreviated
 +melm 212              Title,Title-other-variant
 +melm 214              Title,Title-expanded
 +melm 222              Title,Title-key
 +melm 240$r            Music-key
 +melm 240$n            Thematic-number
 +melm 240              Title:w,Title:p,Title-uniform
 +melm 243$n            Thematic-number
 +melm 243$r            Music-key
 +melm 243              Title:w,Title:p,Title-collective
 +melm 245$a            Title-cover:w,Title-cover:p,Title-cover:s,Title:w,Title:p,Title:s
 +melm 245$c            Author,Author-in-order:w,Author-in-order:p,Author-in-order:s
 +melm 245$9            Cross-Reference:w,Koha-Auth-Number
 +melm 245              Title:w,Title:p
 +melm 246              Title,Title:p,Title-abbreviated,Title-expanded,Title-former
 +melm 247              Title,Title:p,Title-former,Title-other-variant,Related-periodical
 +melm 260$a            pl:w,pl:p
 +melm 260$b            Publisher:w,Publisher:p
++melm 260$c            copydate,copydate:s
 +melm 260              pl
 +melm 300              Extent:w,Extent:p
 +melm 400$a            Name-and-title
 +melm 400$t      Author-title,Name-and-title,Title,Title-series
 +melm 400$9            Koha-Auth-Number
 +melm 400        Author,Author-name-personal,Name,Personal-name
 +melm 410              Author,Corporate-name
 +melm 410$a            Name-and-title
 +melm 410$t      Author-title,Title,Title-series
 +melm 410$9            Koha-Auth-Number
 +melm 410        Author-name-corporate,Name
 +melm 411              Author,Conference-name
 +melm 411$a            Name-and-title
 +#melm 411$t           title,author,Author-title,Title-series
 +melm 411$t      Author-title,Title-series
 +#melm 411             author,Author-name-corporate,Name
 +melm 411        Author-name-corporate,Name
 +melm 440$a            Title-series:w,Title-series:p
 +melm 440$9            Koha-Auth-Number
 +melm 440              Title-series:w,Title-series:p,Title,Title-series
 +melm 490$a            Title-series:w,Title-series:p
 +melm 490              Title,Title-series
 +melm 490$9            Koha-Auth-Number
 +
 +melm 502              Material-type
 +melm 505              Note:w,Note:p
 +melm 510              Indexed-by
 +melm 520              Abstract:w,Abstract:p
 +#melm 533$d           pubdate,pubdate:s
 +#melm 541$d           Date-of-acquisition,Date-of-acquisition:s
 +
 +melm 600$a            Name-and-title,Name,Personal-name,Subject-name-personal,Subject
 +melm 600$t            Name-and-title,Title,Subject
 +melm 600$9      Koha-Auth-Number
 +#melm 600             Name,Personal-name,Subject-heading,Subject-name-personal
 +melm 600        Name,Personal-name,Subject-name-personal,Subject
 +melm 610$a            Name-and-title
 +melm 610$t            Name-and-title,Title
 +melm 610$9      Koha-Auth-Number
 +melm 610              Name,Subject,Corporate-name
 +melm 611              Conference-name
 +melm 611$a            Name-and-title
 +melm 611$t            Name-and-title,Title
 +melm 611$9      Koha-Auth-Number
 +melm 611              Name,Subject
 +melm 630$n            Thematic-number
 +melm 630$r            Music-key
 +melm 630$9      Koha-Auth-Number
 +melm 630              Subject
 +melm 650$9            Koha-Auth-Number        
 +melm 650              Subject,Subject:p
 +melm 651$9            Koha-Auth-Number        
 +melm 651              Name-geographic,Subject,Subject:p
 +melm 652$9            Koha-Auth-Number        
 +#melm 652             subject-heading,subject-heading:p
 +melm 653$9            Koha-Auth-Number        
 +melm 653              Subject,Subject:p
 +melm 654$9            Koha-Auth-Number        
 +melm 654              Subject
 +melm 655$9            Koha-Auth-Number        
 +melm 655              Subject
 +melm 656$9            Koha-Auth-Number        
 +melm 656              Subject
 +melm 657$9            Koha-Auth-Number        
 +melm 657              Subject
 +melm 690$9            Koha-Auth-Number        
 +melm 690              Subject,Subject:p
 +
 +melm 700$9            Cross-Reference,Koha-Auth-Number
 +melm 700$a      Author,Author:p
 +melm 700$n            Thematic-number
 +melm 700$r            Music-key
 +#melm 700$t           author,Author-title,Name-and-title,Title,Title-uniform
 +melm 700$t      Author-title,Name-and-title,Title,Title-uniform
 +melm 700        Author,Author-name-corporate,Author-name-personal,Name,Editor,Personal-name
 +melm 710              Author,Corporate-name
 +#melm 710$t           author,Author-title,Name-and-title,Title,Title-uniform
 +melm 710$t      Author-title,Name-and-title,Title,Title-uniform
 +#melm 710$a           author,author:p,Name-and-title
 +melm 710$a      Name-and-title
 +melm 710$9            Koha-Auth-Number        
 +#melm 710             author,Name
 +melm 710        Author,Name
 +melm 711$a            Name-and-title
 +#melm 711$t           author,Author-title,Title,Title-uniform
 +melm 711$t      Author-title,Title,Title-uniform
 +melm 711$9            Koha-Auth-Number        
 +#melm 711             author,Author-name-corporate,Name,Conference-name
 +melm 711        Author-name-corporate,Name,Conference-name
 +melm 730$n            Thematic-number
 +melm 730$r            Music-key
 +melm 730$9            Koha-Auth-Number
 +melm 730              Title,Title-uniform
 +melm 740              Title,Title-other-variant
 +melm 773$t            Host-item
 +melm 780              Title-former,Related-periodical
 +melm 785              Related-periodical
 +
 +melm 800$a            Name-and-title
 +#melm 800$t           author,Author-title,Name-and-title,Title,Title-series
 +melm 800$t      Author-title,Name-and-title,Title,Title-series
 +melm 800$9            Koha-Auth-Number
 +melm 800        Author,Author-name-personal,Name,Personal-name
 +melm 810$a            Name-and-title
 +melm 810$t      Author-title,Name-and-title,Title,Title-series
 +melm 810$9            Koha-Auth-Number
 +melm 810        Author,Corporate-name,Author-name-corporate,Name
 +melm 811$a            Name-and-title
 +melm 811$9            Koha-Auth-Number
 +#melm 811$t           author,Author-title,Name-and-title,Title,Title-series
 +melm 811$t      Author-title,Name-and-title,Title,Title-series
 +melm 811              Author,Author-name-corporate,Name,Conference-name
 +melm 830$9            Koha-Auth-Number
 +melm 830              Title,Title-series
 +melm 840              Title,Title-series
 +
 +###############################
 +# Koha Local-Use Biblio Indexes
 +melm 999$c            Local-Number:n,Local-Number:w,Local-Number:s
 +melm 999$d            biblioitemnumber:n,biblioitemnumber:w,biblioitemnumber:s
 +melm 942$0            totalissues:n,totalissues:s
 +melm 942$2            cn-bib-source
 +melm 942$6            cn-bib-sort:n,cn-bib-sort:s
 +melm 942$c            itemtype:w
 +melm 942$n            Suppress:w,Suppress:n
 +
 +# need to check bib1
 +melm 942$h            cn-class
 +melm 942$i            cn-item
 +melm 942$k            cn-prefix
 +melm 942$m            cn-suffix
 +
 +# Items Indexes
 +melm 952$0            withdrawn:n,withdrawn:w
 +melm 952$1            lost,lost:n
 +melm 952$2            classification-source
 +melm 952$3            materials-specified     
 +melm 952$4            damaged:n,damaged:w
 +melm 952$5            restricted:n,restricted:w
 +melm 952$6            cn-sort:n,cn-sort:s
 +melm 952$7            notforloan:n,notforloan:w
 +melm 952$8            ccode
 +melm 952$9            itemnumber:n,itemnumber:s
 +melm 952$a            homebranch
 +melm 952$b            holdingbranch
 +melm 952$c            location
 +
 +#dateaccessioned
 +melm 952$d            Date-of-acquisition,Date-of-acquisition:d,Date-of-acquisition:s
 +melm 952$e            acqsource
 +melm 952$f            coded-location-qualifier
 +melm 952$g            price
 +#melm 952$h           
 +#melm 952$i           
 +melm 952$j            stack:n,stack:w
 +#melm 952$k           
 +melm 952$l            issues:n,issues:w,issues:s
 +melm 952$m            renewals:n,renewals:w
 +melm 952$n            reserves:n,reserves:w
 +melm 952$o            Local-classification:w,Local-classification:p,Local-classification:s
 +melm 952$p            barcode,barcode:n
 +melm 952$q            onloan:n,onloan:w
 +melm 952$r            datelastseen
 +melm 952$s            datelastborrowed
 +melm 952$t            copynumber
 +melm 952$u            uri:u
 +melm 952$v            replacementprice
 +melm 952$w            replacementpricedate
 +#melm 952$x
 +melm 952$y            itype:w
 +#melm 952$z