From: Galen Charlton Date: Tue, 18 Dec 2007 23:46:54 +0000 (-0600) Subject: Merge git://git.koha.org/pub/scm/koha X-Git-Tag: v3.00.00-alpha~383^2 X-Git-Url: http://git.rot13.org/?a=commitdiff_plain;h=d579648df109eef4d807e5e29602b9710b8193bf;hp=-c;p=koha.git Merge git://git.koha.org/pub/scm/koha --- d579648df109eef4d807e5e29602b9710b8193bf diff --combined C4/Search.pm index 3b52cae876,b55c71d758..ab6edc3e5d --- a/C4/Search.pm +++ b/C4/Search.pm @@@ -158,7 -158,7 +158,7 @@@ this function performs a simple search =item C * $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 * $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" ) { @@@ -441,15 -441,12 +441,12 @@@ ); } 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"; } @@@ -678,7 -677,7 +677,7 @@@ $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; @@@ -760,9 -760,29 +760,29 @@@ 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) { @@@ -876,15 -896,14 +896,14 @@@ $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 > 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>/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>/gi; - $oldbiblio->{'subtitle'} =~ - s/$term/$&<\/span>/gi; - + $oldbiblio->{'subtitle'} =~ s/$term/$&<\/span>/gi; $oldbiblio->{'author'} =~ s/$term/$&<\/span>/gi; $oldbiblio->{'publishercode'} =~ s/$term/$&<\/span>/gi; $oldbiblio->{'place'} =~ s/$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=~ /%/; @@@ -1364,7 -1392,7 +1392,7 @@@ } } } 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 diff --combined etc/zebradb/marc_defs/marc21/biblios/record.abs index a51c0292f5,0000000000..775fcc1565 mode 100644,000000..100644 --- a/etc/zebradb/marc_defs/marc21/biblios/record.abs +++ b/etc/zebradb/marc_defs/marc21/biblios/record.abs @@@ -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 - ++# 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 005 Date,Date/time-last-modified ++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 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 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 033 Date ++#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 Date,Date:s,Date:y - #,pubdate,pubdate:s ++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