=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.
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();
$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;
# 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) {
}
# 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;
$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
--- /dev/null
-
+# 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