@@ -, +, @@ - IntranetAutocompleteElasticSearch - OPACAutocompleteElasticSearch Instructions here: https://wiki.koha-community.org/wiki/Working_with_SCSS_in_the_OPAC_and_staff_client --- opac/svc/elasticsearch/opac-elasticsearch.pl | 90 ++++++++++++++++++++ 1 file changed, 90 insertions(+) --- a/opac/svc/elasticsearch/opac-elasticsearch.pl +++ a/opac/svc/elasticsearch/opac-elasticsearch.pl @@ -9,6 +9,9 @@ use Unicode::Normalize; use CGI::Session; use Koha::SearchEngine::Elasticsearch::Browse; +use Koha::Items; +use C4::Context; + my $browser = Koha::SearchEngine::Elasticsearch::Browse->new( { index => 'biblios' } ); my $cgi = CGI->new; my $session = CGI::Session->load() or die CGI::Session->errstr(); @@ -33,12 +36,99 @@ if ($session->param("key") eq "autocomplete") { #search by many prefix fields if ($length > 1){ my $res = $browser->autocomplete_idx($ses, \@prefix, $session->param("analyzer"), $session->param("token_counter")); + + if (C4::Context->yaml_preference('OpacHiddenItems')) { + my @prefix = $res->{ "prefix" }; + @prefix = split(',', $prefix[0]); + + my %biblionumbers; + for (my $i = 0; $i < scalar @prefix; $i++) { + my @hits = @{$res->{ "$i" }->{ "hits" }->{ "hits" }}; + if (@hits) { + for (my $j = 0; $j < scalar @hits; $j++) { + # biblionumber->prefix position = hit position within prefix + $biblionumbers{ $hits[$j]->{ "_id" } }{ $i } = $j; + } + } + } + + if (%biblionumbers) { + my @biblionumbers = keys %biblionumbers; + my $autocomplete_items = Koha::Items->search({ + biblionumber => { -in => \@biblionumbers } + }); + my $filtered_items = $autocomplete_items->filter_by_visible_in_opac({ + patron => undef + }); + + foreach (@biblionumbers) { + my $biblionumber = $_; + my $item = $filtered_items->find({ + biblionumber => $biblionumber + }); + if (!$item) { + my %removelist = %{$biblionumbers{ $biblionumber }}; + foreach (keys %removelist) { + my $hits = $res->{ $_ }->{ "hits" }->{ "hits" }; + splice(@{$hits}, $removelist{ $_ }, 1); + $res->{ $_ }->{ "hits" }->{ "total" }--; + } + } + } + for (my $i = 0; $i < scalar @prefix; $i++) { + if ($res->{ $i }->{ "hits" }->{ "max_score" }) { + my $hits = $res->{ $i }->{ "hits" }->{ "hits" }; + my $maxscore = 0; + foreach ( @{$hits} ) { + my $score = $_->{"_score"}; + $maxscore = $score if ($maxscore < $score); + } + $res->{ $i }->{ "hits" }->{ "max_score" } = $maxscore; + } + } + } + } + print $cgi->header("application/json"); print to_json($res); } #search by one prefix field elsif ($length == 1) { my $res = $browser->autocomplete_one_idx($ses, $prefix[0], $session->param("analyzer"), $session->param("token_counter")); + + if (C4::Context->yaml_preference('OpacHiddenItems')) { + my $hits = $res->{ "hits" }->{ "hits" }; + if (@{$hits}) { + my @biblionumbers; + foreach ( @{$hits} ) { + push(@biblionumbers, $_->{"_id"}); + } + + my $autocomplete_items = Koha::Items->search({ + biblionumber => { -in => \@biblionumbers } + }); + my $filtered_items = $autocomplete_items->filter_by_visible_in_opac({ + patron => undef + }); + + for ( my $i = 0; $i < scalar @biblionumbers; $i++ ) { + my $item = $filtered_items->find({ + biblionumber => $biblionumbers[$i] + }); + if (!$item) { + splice(@{$hits}, $i, 1); + $res->{ "hits" }->{ "total" }--; + } + } + my $maxscore = 0; + foreach ( @{$hits} ) { + my $score = $_->{"_score"}; + $maxscore = $score if ($maxscore < $score); + } + $res->{ "hits" }->{ "max_score" } = $maxscore; + } + } + print $cgi->header("application/json"); print to_json($res); } --