|
Lines 619-625
sub get_matches {
Link Here
|
| 619 |
my $self = shift; |
619 |
my $self = shift; |
| 620 |
my ($source_record, $max_matches) = @_; |
620 |
my ($source_record, $max_matches) = @_; |
| 621 |
|
621 |
|
| 622 |
my %matches = (); |
622 |
my $matches = {}; |
|
|
623 |
my $marcframework_used = ''; # use the default framework |
| 623 |
|
624 |
|
| 624 |
my $QParser; |
625 |
my $QParser; |
| 625 |
$QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser')); |
626 |
$QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser')); |
|
Lines 663-668
sub get_matches {
Link Here
|
| 663 |
my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX}); |
664 |
my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX}); |
| 664 |
( $error, $searchresults, $total_hits ) = |
665 |
( $error, $searchresults, $total_hits ) = |
| 665 |
$searcher->simple_search_compat( $query, 0, $max_matches ); |
666 |
$searcher->simple_search_compat( $query, 0, $max_matches ); |
|
|
667 |
|
| 668 |
if ( defined $error ) { |
| 669 |
warn "search failed ($query) $error"; |
| 670 |
} |
| 671 |
else { |
| 672 |
if ( C4::Context->preference('SearchEngine') eq 'Elasticsearch' ) { |
| 673 |
foreach my $matched ( @{$searchresults} ) { |
| 674 |
my ( $biblionumber_tag, $biblionumber_subfield ) = C4::Biblio::GetMarcFromKohaField( "biblio.biblionumber", $marcframework_used ); |
| 675 |
my $id = $matched->field($biblionumber_tag)->subfield($biblionumber_subfield); |
| 676 |
$matches->{$id}->{score} += $matchpoint->{score}; |
| 677 |
$matches->{$id}->{record} = $matched; |
| 678 |
} |
| 679 |
} |
| 680 |
else { |
| 681 |
foreach my $matched ( @{$searchresults} ) { |
| 682 |
$matches->{$matched}->{score} += $matchpoint->{'score'}; |
| 683 |
$matches->{$matched}->{record} = $matched; |
| 684 |
} |
| 685 |
} |
| 686 |
} |
| 687 |
|
| 666 |
} |
688 |
} |
| 667 |
elsif ( $self->{'record_type'} eq 'authority' ) { |
689 |
elsif ( $self->{'record_type'} eq 'authority' ) { |
| 668 |
my $authresults; |
690 |
my $authresults; |
|
Lines 685-725
sub get_matches {
Link Here
|
| 685 |
'AuthidAsc', 1 |
707 |
'AuthidAsc', 1 |
| 686 |
); |
708 |
); |
| 687 |
foreach my $result (@$authresults) { |
709 |
foreach my $result (@$authresults) { |
| 688 |
push @$searchresults, $result->{'authid'}; |
710 |
my $id = $result->{authid}; |
| 689 |
} |
711 |
$matches->{$id}->{score} += $matchpoint->{'score'}; |
| 690 |
} |
712 |
$matches->{$id}->{record} = $id; |
| 691 |
|
|
|
| 692 |
if ( defined $error ) { |
| 693 |
warn "search failed ($query) $error"; |
| 694 |
} |
| 695 |
else { |
| 696 |
foreach my $matched ( @{$searchresults} ) { |
| 697 |
$matches{$matched} += $matchpoint->{'score'}; |
| 698 |
} |
713 |
} |
| 699 |
} |
714 |
} |
| 700 |
} |
715 |
} |
| 701 |
|
716 |
|
| 702 |
# get rid of any that don't meet the threshold |
717 |
# get rid of any that don't meet the threshold |
| 703 |
%matches = map { ($matches{$_} >= $self->{'threshold'}) ? ($_ => $matches{$_}) : () } keys %matches; |
718 |
$matches = { map { ($matches->{$_}->{score} >= $self->{'threshold'}) ? ($_ => $matches->{$_}) : () } keys %$matches }; |
| 704 |
|
|
|
| 705 |
# get rid of any that don't meet the required checks |
| 706 |
%matches = map { _passes_required_checks($source_record, $_, $self->{'required_checks'}) ? ($_ => $matches{$_}) : () } |
| 707 |
keys %matches unless ($self->{'record_type'} eq 'auth'); |
| 708 |
|
719 |
|
| 709 |
my @results = (); |
720 |
my @results = (); |
| 710 |
if ($self->{'record_type'} eq 'biblio') { |
721 |
if ($self->{'record_type'} eq 'biblio') { |
| 711 |
require C4::Biblio; |
722 |
require C4::Biblio; |
| 712 |
foreach my $marcblob (keys %matches) { |
723 |
# get rid of any that don't meet the required checks |
| 713 |
my $target_record = C4::Search::new_record_from_zebra('biblioserver',$marcblob); |
724 |
$matches = { |
| 714 |
my $record_number; |
725 |
map { |
| 715 |
my $result = C4::Biblio::TransformMarcToKoha($target_record, ''); |
726 |
_passes_required_checks( $source_record, $_, $self->{'required_checks'} ) |
| 716 |
$record_number = $result->{'biblionumber'}; |
727 |
? ( $_ => $matches->{$_} ) |
| 717 |
push @results, { 'record_id' => $record_number, 'score' => $matches{$marcblob} }; |
728 |
: () |
|
|
729 |
} keys %$matches |
| 730 |
}; |
| 731 |
|
| 732 |
foreach my $id ( keys %$matches ) { |
| 733 |
my $target_record = C4::Search::new_record_from_zebra( 'biblioserver', $matches->{$id}->{record} ); |
| 734 |
my $result = C4::Biblio::TransformMarcToKoha( $target_record, $marcframework_used ); |
| 735 |
push @results, { |
| 736 |
record_id => $result->{biblionumber}, |
| 737 |
score => $matches->{$id}->{score} |
| 738 |
}; |
| 718 |
} |
739 |
} |
| 719 |
} elsif ($self->{'record_type'} eq 'authority') { |
740 |
} elsif ($self->{'record_type'} eq 'authority') { |
| 720 |
require C4::AuthoritiesMarc; |
741 |
require C4::AuthoritiesMarc; |
| 721 |
foreach my $authid (keys %matches) { |
742 |
foreach my $id (keys %$matches) { |
| 722 |
push @results, { 'record_id' => $authid, 'score' => $matches{$authid} }; |
743 |
push @results, { |
|
|
744 |
record_id => $id, |
| 745 |
score => $matches->{$id}->{score} |
| 746 |
}; |
| 723 |
} |
747 |
} |
| 724 |
} |
748 |
} |
| 725 |
@results = sort { $b->{'score'} cmp $a->{'score'} } @results; |
749 |
@results = sort { $b->{'score'} cmp $a->{'score'} } @results; |
|
Lines 727-733
sub get_matches {
Link Here
|
| 727 |
@results = @results[0..$max_matches-1]; |
751 |
@results = @results[0..$max_matches-1]; |
| 728 |
} |
752 |
} |
| 729 |
return @results; |
753 |
return @results; |
| 730 |
|
|
|
| 731 |
} |
754 |
} |
| 732 |
|
755 |
|
| 733 |
=head2 dump |
756 |
=head2 dump |
| 734 |
- |
|
|