Main Koha release repository
https://koha-community.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.4 KiB
106 lines
3.4 KiB
package Koha::SearchEngine::Solr::Index;
|
|
use Moose::Role;
|
|
with 'Koha::SearchEngine::IndexRole';
|
|
|
|
use Data::SearchEngine::Solr;
|
|
use Data::Dump qw(dump);
|
|
use List::MoreUtils qw(uniq);
|
|
|
|
use Koha::SearchEngine::Solr;
|
|
use C4::AuthoritiesMarc;
|
|
use C4::Biblio;
|
|
use Koha::RecordProcessor;
|
|
|
|
has searchengine => (
|
|
is => 'rw',
|
|
isa => 'Koha::SearchEngine::Solr',
|
|
default => sub { Koha::SearchEngine::Solr->new },
|
|
lazy => 1
|
|
);
|
|
|
|
sub optimize {
|
|
my ( $self ) = @_;
|
|
return $self->searchengine->_solr->optimize;
|
|
}
|
|
|
|
sub index_record {
|
|
my ($self, $recordtype, $recordids) = @_;
|
|
|
|
my $indexes = $self->searchengine->config->indexes;
|
|
my @records;
|
|
|
|
my $recordids_str = ref($recordids) eq 'ARRAY'
|
|
? join " ", @$recordids
|
|
: $recordids;
|
|
warn "IndexRecord called with $recordtype $recordids_str";
|
|
|
|
for my $id ( @$recordids ) {
|
|
my $record;
|
|
|
|
$record = GetAuthority( $id ) if $recordtype eq "authority";
|
|
$record = GetMarcBiblio( $id ) if $recordtype eq "biblio";
|
|
|
|
if ($recordtype eq 'biblio' && C4::Context->preference('IncludeSeeFromInSearches')) {
|
|
my $normalizer = Koha::RecordProcessor->new( { filters => 'EmbedSeeFromHeadings' } );
|
|
$record = $normalizer->process($record);
|
|
}
|
|
|
|
next unless ( $record );
|
|
|
|
my $index_values = {
|
|
recordid => $id,
|
|
recordtype => $recordtype,
|
|
};
|
|
|
|
warn "Indexing $recordtype $id";
|
|
|
|
for my $index ( @$indexes ) {
|
|
next if $index->{ressource_type} ne $recordtype;
|
|
my @values;
|
|
eval {
|
|
my $mappings = $index->{mappings};
|
|
for my $tag_subf_code ( sort @$mappings ) {
|
|
my ( $f, $sf ) = split /\$/, $tag_subf_code;
|
|
for my $field ( $record->field( $f ) ) {
|
|
if ( $field->is_control_field ) {
|
|
push @values, $field->data;
|
|
} else {
|
|
my @sfvals = $sf eq '*'
|
|
? map { $_->[1] } $field->subfields
|
|
: map { $_ } $field->subfield( $sf );
|
|
|
|
for ( @sfvals ) {
|
|
$_ = NormalizeDate( $_ ) if $index->{type} eq 'date';
|
|
push @values, $_ if $_;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@values = uniq (@values); #Removes duplicates
|
|
|
|
$index_values->{$index->{type}."_".$index->{code}} = \@values;
|
|
if ( $index->{sortable} ){
|
|
$index_values->{"srt_" . $index->{type} . "_".$index->{code}} = $values[0];
|
|
}
|
|
# Add index str for facets if it's not exist
|
|
if ( $index->{facetable} and @values > 0 and $index->{type} ne 'str' ) {
|
|
$index_values->{"str_" . $index->{code}} = $values[0];
|
|
}
|
|
};
|
|
if ( $@ ) {
|
|
chomp $@;
|
|
warn "Error during indexation : recordid $id, index $index->{code} ( $@ )";
|
|
}
|
|
}
|
|
|
|
my $solrrecord = Data::SearchEngine::Item->new(
|
|
id => "${recordtype}_$id",
|
|
score => 1,
|
|
values => $index_values,
|
|
);
|
|
push @records, $solrrecord;
|
|
}
|
|
$self->searchengine->add( \@records );
|
|
}
|
|
|
|
1;
|
|
|