@@ -, +, @@ curl -XPUT http://elasticsearch/koha_master_biblios/_settings -d \ '{"index": {"max_result_window": 20000}}' --- Koha/SearchEngine/Elasticsearch/Search.pm | 19 +++++++++++++++++++ Koha/SearchEngine/Zebra/Search.pm | 2 ++ catalogue/search.pl | 3 ++- opac/opac-search.pl | 3 ++- .../Koha_SearchEngine_Elasticsearch_Search.t | 15 +++++++++++++-- 5 files changed, 38 insertions(+), 4 deletions(-) --- a/Koha/SearchEngine/Elasticsearch/Search.pm +++ a/Koha/SearchEngine/Elasticsearch/Search.pm @@ -399,6 +399,25 @@ sub json2marc { return $marc; } +sub max_result_window { + my ($self) = @_; + + $self->store( + Catmandu::Store::ElasticSearch->new(%{ $self->get_elasticsearch_params }) + ) unless $self->store; + + my $index_name = $self->store->index_name; + my $settings = $self->store->es->indices->get_settings( + index => $index_name, + params => { include_defaults => 1, flat_settings => 1 }, + ); + + my $max_result_window = $settings->{$index_name}->{settings}->{'index.max_result_window'}; + $max_result_window //= $settings->{$index_name}->{defaults}->{'index.max_result_window'}; + + return $max_result_window; +} + =head2 _convert_facets my $koha_facets = _convert_facets($es_facets, $expanded_facet); --- a/Koha/SearchEngine/Zebra/Search.pm +++ a/Koha/SearchEngine/Zebra/Search.pm @@ -110,4 +110,6 @@ sub search_auth_compat { C4::AuthoritiesMarc::SearchAuthorities(@params); } +sub max_result_window { undef } + 1; --- a/catalogue/search.pl +++ a/catalogue/search.pl @@ -619,7 +619,8 @@ for (my $i=0;$i<@servers;$i++) { ## FIXME: add a global function for this, it's better than the current global one ## Build the page numbers on the bottom of the page my @page_numbers; - my $hits_to_paginate = C4::Context->preference('SearchEngine') eq 'Elasticsearch' ? 10000 : $hits; + my $max_result_window = $searcher->max_result_window; + my $hits_to_paginate = ($max_result_window && $max_result_window < $hits) ? $max_result_window : $hits; $template->param( hits_to_paginate => $hits_to_paginate ); # total number of pages there will be my $pages = ceil($hits_to_paginate / $results_per_page); --- a/opac/opac-search.pl +++ a/opac/opac-search.pl @@ -830,7 +830,8 @@ for (my $i=0;$i<@servers;$i++) { } ## Build the page numbers on the bottom of the page my @page_numbers; - my $hits_to_paginate = C4::Context->preference('SearchEngine') eq 'Elasticsearch' ? 10000 : $hits; + my $max_result_window = $searcher->max_result_window; + my $hits_to_paginate = ($max_result_window && $max_result_window < $hits) ? $max_result_window : $hits; $template->param( hits_to_paginate => $hits_to_paginate ); # total number of pages there will be my $pages = ceil($hits_to_paginate / $results_per_page); --- a/t/db_dependent/Koha_SearchEngine_Elasticsearch_Search.t +++ a/t/db_dependent/Koha_SearchEngine_Elasticsearch_Search.t @@ -17,10 +17,12 @@ use Modern::Perl; -use Test::More tests => 13; +use Test::More tests => 15; use t::lib::Mocks; use Koha::SearchEngine::Elasticsearch::QueryBuilder; +use Koha::SearchEngine::Elasticsearch::Indexer; + my $builder = Koha::SearchEngine::Elasticsearch::QueryBuilder->new( { index => 'mydb' } ); @@ -41,9 +43,11 @@ SKIP: { eval { $builder->get_elasticsearch_params; }; - skip 'ElasticSeatch configuration not available', 6 + skip 'ElasticSeatch configuration not available', 8 if $@; + Koha::SearchEngine::Elasticsearch::Indexer->new({ index => 'mydb' })->drop_index; + ok( my $results = $searcher->search( $query) , 'Do a search ' ); ok( my $marc = $searcher->json2marc( $results->first ), 'Convert JSON to MARC'); @@ -56,6 +60,13 @@ SKIP: { is ( $count = $searcher->count_auth_use($searcher,1), 0, 'Testing count_auth_use'); + is ($searcher->max_result_window, 10000, 'By default, max_result_window is 10000'); + $searcher->store->es->indices->put_settings(index => $searcher->store->index_name, body => { + 'index' => { + 'max_result_window' => 12000, + }, + }); + is ($searcher->max_result_window, 12000, 'max_result_window returns the correct value'); } subtest 'json2marc' => sub { --