merging tag & subfield in marc_word for better perfs

This commit is contained in:
tipaul 2004-06-17 08:16:32 +00:00
parent ea807900bf
commit b6cc6680dc
2 changed files with 26 additions and 21 deletions

View file

@ -551,7 +551,7 @@ sub MARCdelbiblio {
$sth->execute;
my $itemtag = $sth->fetchrow_hashref->{tagfield};
$dbh->do("delete from marc_subfield_table where bibid=$bibid and tag<>$itemtag");
$dbh->do("delete from marc_word where bibid=$bibid and tag<>$itemtag");
$dbh->do("delete from marc_word where bibid=$bibid and not (tagsubfield like \"$itemtag%\")");
} else {
$dbh->do("delete from marc_biblio where bibid=$bibid");
$dbh->do("delete from marc_subfield_table where bibid=$bibid");
@ -947,14 +947,14 @@ sub MARCaddword {
$sentence =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\})/ /g;
my @words = split / /,$sentence;
my $stopwords= C4::Context->stopwords;
my $sth=$dbh->prepare("insert into marc_word (bibid, tag, tagorder, subfieldid, subfieldorder, word, sndx_word)
values (?,?,?,?,?,?,soundex(?))");
my $sth=$dbh->prepare("insert into marc_word (bibid, tagsubfield, tagorder, subfieldorder, word, sndx_word)
values (?,concat(?,?),?,?,?,soundex(?))");
foreach my $word (@words) {
# we record only words one char long and not in stopwords hash
if (length($word)>=1 and !($stopwords->{uc($word)})) {
$sth->execute($bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$word,$word);
if ($sth->err()) {
warn "ERROR ==> insert into marc_word (bibid, tag, tagorder, subfieldid, subfieldorder, word, sndx_word) values ($bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$word,soundex($word))\n";
warn "ERROR ==> insert into marc_word (bibid, tagsubfield, tagorder, subfieldorder, word, sndx_word) values ($bibid,concat($tag,$subfieldid),$tagorder,$subfieldorder,$word,soundex($word))\n";
}
}
}
@ -963,8 +963,8 @@ sub MARCaddword {
sub MARCdelword {
# delete words. this sub deletes all the words from a sentence. a subfield modif is done by a delete then a add
my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
my $sth=$dbh->prepare("delete from marc_word where bibid=? and tag=? and tagorder=? and subfieldid=? and subfieldorder=?");
$sth->execute($bibid,$tag,$tagorder,$subfield,$subfieldorder);
my $sth=$dbh->prepare("delete from marc_word where bibid=? and tagsubfield=concat(?,?) and tagorder=? and subfieldorder=?");
$sth->execute($bibid,$tag,$subfield,$tagorder,$subfieldorder);
}
#
@ -2191,6 +2191,9 @@ Paul POULAIN paul.poulain@free.fr
# $Id$
# $Log$
# Revision 1.94 2004/06/17 08:16:32 tipaul
# merging tag & subfield in marc_word for better perfs
#
# Revision 1.93 2004/06/11 15:38:06 joshferraro
# Changes MARCaddword to index words >= 1 char ... needed for more accurate
# searches using SearchMarc routines.

View file

@ -274,18 +274,20 @@ sub catalogsearch {
}
# add the last line, that is not reached byt the loop / if ($oldbiblionumber...)
my %newline;
%newline = %$oldline;
$newline{totitem} = $totalitems;
$newline{biblionumber} = $oldbiblionumber;
my @CNresults2= @CNresults;
$newline{CN} = \@CNresults2;
$newline{'even'} = 1 if $counter % 2 == 0;
$newline{'odd'} = 1 if $counter % 2 == 1;
@CNresults = ();
my @CNresults2= @CNresults;
$newline{CN} = \@CNresults2;
@CNresults = ();
push @finalresult, \%newline;
if ($oldline) {
%newline = %$oldline;
$newline{totitem} = $totalitems;
$newline{biblionumber} = $oldbiblionumber;
my @CNresults2= @CNresults;
$newline{CN} = \@CNresults2;
$newline{'even'} = 1 if $counter % 2 == 0;
$newline{'odd'} = 1 if $counter % 2 == 1;
@CNresults = ();
my @CNresults2= @CNresults;
$newline{CN} = \@CNresults2;
@CNresults = ();
push @finalresult, \%newline;
}
my $nbresults = $#result + 1;
return (\@finalresult, $nbresults);
}
@ -316,7 +318,7 @@ sub create_request {
$sql_tables .= "marc_word as m$nb_table,";
$sql_where1 .= "(m1.word like ".$dbh->quote("@$value[$i]%");
if (@$tags[$i]) {
$sql_where1 .=" and m1.tag+m1.subfieldid in (@$tags[$i])";
$sql_where1 .=" and m1.tagsubfield in (@$tags[$i])";
}
$sql_where1.=")";
} else {
@ -343,14 +345,14 @@ sub create_request {
$sql_tables .= "marc_word as m$nb_table,";
$sql_where1 .= "@$and_or[$i] (m$nb_table.word like ".$dbh->quote("@$value[$i]%");
if (@$tags[$i]) {
$sql_where1 .=" and m$nb_table.tag+m$nb_table.subfieldid in(@$tags[$i])";
$sql_where1 .=" and m$nb_table.tagsubfield in(@$tags[$i])";
}
$sql_where1.=")";
$sql_where2 .= "m1.bibid=m$nb_table.bibid and ";
} else {
$sql_where1 .= "@$and_or[$i] (m$nb_table.word like ".$dbh->quote("@$value[$i]%");
if (@$tags[$i]) {
$sql_where1 .=" and m$nb_table.tag+m$nb_table.subfieldid in (@$tags[$i])";
$sql_where1 .=" and m$nb_table.tagsubfield in (@$tags[$i])";
}
$sql_where1.=")";
$sql_where2 .= "m1.bibid=m$nb_table.bibid and ";