1 package Koha::SearchEngine::Solr::Search;
3 with 'Koha::SearchEngine::SearchRole';
5 use Data::Dump qw(dump);
8 use Data::SearchEngine::Solr;
10 use Data::SearchEngine::Query;
11 use Koha::SearchEngine::Solr;
15 isa => 'Koha::SearchEngine::Solr',
16 default => sub { Koha::SearchEngine::Solr->new },
21 my ( $self, $q, $filters, $params ) = @_;
25 my $page = defined $params->{page} ? $params->{page} : 1;
26 my $count = defined $params->{count} ? $params->{count} : 999999999;
27 my $sort = defined $params->{sort} ? $params->{sort} : 'score desc';
28 my $facets = defined $params->{facets} ? $params->{facets} : 0;
30 # Construct fl from $params->{fl}
31 # If "recordid" or "id" not exist, we push them
36 grep ( /^recordid$/, @{$params->{fl}} ) ? () : "recordid",
37 grep ( /^id$/, @{$params->{fl}} ) ? () : "id"
39 : ( "recordid", "id" );
42 $recordtype = ref($filters->{recordtype}) eq 'ARRAY'
43 ? $filters->{recordtype}[0]
44 : $filters->{recordtype}
45 if defined $filters && defined $filters->{recordtype};
48 $self->searchengine->options->{"facet"} = 'true';
49 $self->searchengine->options->{"facet.mincount"} = 1;
50 $self->searchengine->options->{"facet.limit"} = 10; # TODO create a new systempreference C4::Context->preference("numFacetsDisplay")
51 my @facetable_indexes = map { 'str_' . $_->{code} } @{$self->searchengine->config->facetable_indexes};
52 $self->searchengine->options->{"facet.field"} = \@facetable_indexes;
54 $self->searchengine->options->{sort} = $sort;
55 $self->searchengine->options->{fl} = $fl;
58 $self->searchengine->options->{fq} = [
61 ref($filters->{$idx}) eq 'ARRAY'
67 utf8::decode($filter_str);
68 my $quotes_existed = ( $filter_str =~ m/^".*"$/ );
69 $filter_str =~ s/^"(.*)"$/$1/; #remove quote around value if exist
70 $filter_str =~ s/[^\\]\K"/\\"/g;
71 $filter_str = qq{"$filter_str"} # Add quote around value if not exist
72 if not $filter_str =~ /^".*"$/
75 } @{ $filters->{$idx} } )
77 : "$idx:$filters->{$idx}";
81 my $sq = Data::SearchEngine::Query->new(
88 my $results = eval { $self->searchengine->search( $sq ) };
94 $err =~ s#^[^\n]*\n##; # Delete first line
95 if ( $err =~ "400 URL must be absolute" ) {
96 $err = "Your system preference 'SolrAPI' is not set correctly";
98 elsif ( not $err =~ 'Connection refused' ) {
99 my $document = XMLin( $err );
100 $err = "$$document{body}{h2} : $$document{body}{pre}";
102 $results->{error} = $err;