From cc2f905f40e08614bc04454863a93619ed787936 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 22 Oct 2019 14:38:58 +0000 Subject: [PATCH] Bug 23875: Explicitly srt searches by score and provide local-number as tie breaker To test: 1 - Set search engine to ES 2 - Search the catalog for "*" 3 - Note results 4 - Edit first result 5 - Repeat search, results are reordered 6 - Apply patch 7 - Search for "*" 8 - Highest biblionumbers are returned first 9 - Edit first result, repeat search 10 - Order does not change 11 - Confirm sorting by author, title, etc passes the same trials Signed-off-by: David Nind Signed-off-by: Martin Renvoize --- Koha/SearchEngine/Elasticsearch/QueryBuilder.pm | 8 ++++++++ .../SearchEngine/Elasticsearch/QueryBuilder.t | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 0e9d964727b..c1b54491131 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -227,6 +227,14 @@ sub build_query { } } + # If not sorting by anything explicitly search by score + if ( !defined $res->{sort} ) { + push @{ $res->{sort} }, { _score => { order => 'desc' } }; + } + + # Add a tie breaker in case of equally relevant records + push @{ $res->{sort} }, { 'local-number' => { order => 'desc' } }; + unless ( $options{skip_facets} ) { # See _convert_facets in Search.pm for how these get turned into diff --git a/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t b/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t index b1ed5d1cb67..79380ee7c16 100755 --- a/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t +++ b/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t @@ -228,7 +228,7 @@ subtest 'build_authorities_query_compat() tests' => sub { }; subtest 'build_query tests' => sub { - plan tests => 68; + plan tests => 69; my $qb; @@ -245,7 +245,7 @@ subtest 'build_query tests' => sub { is_deeply( $query->{sort}, - [ { 'title__sort' => { 'order' => 'asc' } } ], + [ { 'title__sort' => { 'order' => 'asc' } }, { 'local-number' => { 'order' => 'desc' } } ], "sort parameter properly formed" ); @@ -267,6 +267,17 @@ subtest 'build_query tests' => sub { $query = $qb->build_query( 'test', %options ); ok( !defined $query->{aggregations}, 'Skipping facets means we do not have aggregations in the the query' ); + $query = $qb->build_query( 'test', () ); + + is_deeply( + $query->{sort}, + [ + { '_score' => { 'order' => 'desc' } }, + { 'local-number' => { 'order' => 'desc' } } + ], + "sort parameter properly formed if no sort passed" + ); + t::lib::Mocks::mock_preference( 'QueryAutoTruncate', '' ); ( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); -- 2.49.0