1 package Koha::SearchEngine::Solr::Index;
3 with 'Koha::SearchEngine::IndexRole';
5 use Data::SearchEngine::Solr;
6 use Data::Dump qw(dump);
7 use List::MoreUtils qw(uniq);
9 use Koha::SearchEngine::Solr;
10 use C4::AuthoritiesMarc;
15 isa => 'Koha::SearchEngine::Solr',
16 default => sub { Koha::SearchEngine::Solr->new },
22 return $self->searchengine->_solr->optimize;
26 my ($self, $recordtype, $recordids) = @_;
28 my $indexes = $self->searchengine->config->indexes;
31 my $recordids_str = ref($recordids) eq 'ARRAY'
32 ? join " ", @$recordids
34 warn "IndexRecord called with $recordtype $recordids_str";
36 for my $id ( @$recordids ) {
39 $record = GetAuthority( $id ) if $recordtype eq "authority";
40 $record = GetMarcBiblio( $id ) if $recordtype eq "biblio";
42 next unless ( $record );
46 recordtype => $recordtype,
49 warn "Indexing $recordtype $id";
51 for my $index ( @$indexes ) {
52 next if $index->{ressource_type} ne $recordtype;
55 my $mappings = $index->{mappings};
56 for my $tag_subf_code ( sort @$mappings ) {
57 my ( $f, $sf ) = split /\$/, $tag_subf_code;
58 for my $field ( $record->field( $f ) ) {
59 if ( $field->is_control_field ) {
60 push @values, $field->data;
62 my @sfvals = $sf eq '*'
63 ? map { $_->[1] } $field->subfields
64 : map { $_ } $field->subfield( $sf );
67 $_ = NormalizeDate( $_ ) if $index->{type} eq 'date';
68 push @values, $_ if $_;
73 @values = uniq (@values); #Removes duplicates
75 $index_values->{$index->{type}."_".$index->{code}} = \@values;
76 if ( $index->{sortable} ){
77 $index_values->{"srt_" . $index->{type} . "_".$index->{code}} = $values[0];
79 # Add index str for facets if it's not exist
80 if ( $index->{facetable} and @values > 0 and $index->{type} ne 'str' ) {
81 $index_values->{"str_" . $index->{code}} = $values[0];
86 warn "Error during indexation : recordid $id, index $index->{code} ( $@ )";
90 my $solrrecord = Data::SearchEngine::Item->new(
91 id => "${recordtype}_$id",
93 values => $index_values,
95 push @records, $solrrecord;
97 $self->searchengine->add( \@records );