From d21a1fb964d26192977bb0ba5145906b8a1a31cb Mon Sep 17 00:00:00 2001 From: Ere Maijala Date: Tue, 16 Apr 2019 16:26:40 +0300 Subject: [PATCH] Bug 22524: Fix publication date and year search with Elasticsearch Also fixes the mappings.yaml to use correct field name (left over issue from bug 19575), so reset mappings and reindex before testing. Test plan: 1. Reset mappings and reindex biblios. 2. Check that tests in t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t pass. 3. Try that all of the following year range type work in publication date search and year limit in advanced search: yyyy yyyy-yyyy -yyyy yyyy- Signed-off-by: Liz Rea Signed-off-by: Nick Clemens Signed-off-by: Martin Renvoize (cherry picked from commit 2293e6597c69d55ce5916b7a31029f13d65d4fea) Signed-off-by: Fridolin Somers --- .../Elasticsearch/QueryBuilder.pm | 12 +++++- .../searchengine/elasticsearch/mappings.yaml | 4 +- .../SearchEngine/Elasticsearch/QueryBuilder.t | 38 ++++++++++++++++++- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 0cbca55331..7160b5b164 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -623,7 +623,7 @@ sub _convert_index_fields { my ( $self, @indexes ) = @_; my %index_type_convert = - ( __default => undef, phr => 'phrase', rtrn => 'right-truncate' ); + ( __default => undef, phr => 'phrase', rtrn => 'right-truncate', 'st-year' => 'st-year' ); # Convert according to our table, drop anything that doesn't convert. # If a field starts with mc- we save it as it's used (and removed) later @@ -730,6 +730,13 @@ sub _modify_string_by_type { $str .= '*' if $type eq 'right-truncate'; $str = '"' . $str . '"' if $type eq 'phrase'; + if ($type eq 'st-year') { + if ($str =~ /^(.*)-(.*)$/) { + my $from = $1 || '*'; + my $until = $2 || '*'; + $str = "[$from TO $until]"; + } + } return $str; } @@ -802,7 +809,7 @@ sub _create_query_string { my $field = $_->{field} ? $_->{field} . ':' : ''; my $oand = $self->_modify_string_by_type(%$_); - $oand = "($oand)" if $field && scalar(split(/\s+/, $oand)) > 1; + $oand = "($oand)" if $field && scalar(split(/\s+/, $oand)) > 1 && (!defined $_->{type} || $_->{type} ne 'st-year'); "$otor($field$oand)"; } @queries; } @@ -870,6 +877,7 @@ sub _fix_limit_special_cases { elsif ( $l =~ /^yr,st-numeric=/ ) { my ($date) = ( $l =~ /^yr,st-numeric=(.*)$/ ); next unless defined($date); + $date = $self->_modify_string_by_type(type => 'st-year', operand => $date); push @new_lim, "copydate:$date"; } elsif ( $l =~ /^available$/ ) { diff --git a/admin/searchengine/elasticsearch/mappings.yaml b/admin/searchengine/elasticsearch/mappings.yaml index a546c341e6..e2b17b25f8 100644 --- a/admin/searchengine/elasticsearch/mappings.yaml +++ b/admin/searchengine/elasticsearch/mappings.yaml @@ -3167,8 +3167,8 @@ biblios: sort: ~ suggestible: '' type: '' - pubdate: - label: pubdate + date-of-publication: + label: date-of-publication mappings: - facet: '' marc_field: 008_/7-10 diff --git a/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t b/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t index df2f323383..dfdd84dfbb 100644 --- a/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t +++ b/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t @@ -169,7 +169,7 @@ subtest 'build_authorities_query_compat() tests' => sub { }; subtest 'build_query tests' => sub { - plan tests => 33; + plan tests => 38; my $qb; @@ -243,6 +243,42 @@ subtest 'build_query tests' => sub { is($query_cgi, 'idx=ti&q=%22donald%20duck%22&idx=au&q=walt%20disney', 'query cgi ok for multiterm query'); is($query_desc, '(title:("donald duck")) (author:(walt disney))', 'query desc ok for multiterm query'); + ( undef, $query ) = $qb->build_query_compat( undef, ['2019'], ['yr,st-year'] ); + is( + $query->{query}{query_string}{query}, + '(date-of-publication:2019)', + 'Year in an st-year search is handled properly' + ); + + ( undef, $query ) = $qb->build_query_compat( undef, ['2018-2019'], ['yr,st-year'] ); + is( + $query->{query}{query_string}{query}, + '(date-of-publication:[2018 TO 2019])', + 'Year range in an st-year search is handled properly' + ); + + ( undef, $query ) = $qb->build_query_compat( undef, ['-2019'], ['yr,st-year'] ); + is( + $query->{query}{query_string}{query}, + '(date-of-publication:[* TO 2019])', + 'Open start year in year range of an st-year search is handled properly' + ); + + ( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'] ); + is( + $query->{query}{query_string}{query}, + '(date-of-publication:[2019 TO *])', + 'Open end year in year range of an st-year search is handled properly' + ); + + ( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'], ['yr,st-numeric=-2019'] ); + is( + $query->{query}{query_string}{query}, + '(date-of-publication:[2019 TO *]) AND copydate:[* TO 2019]', + 'Open end year in year range of an st-year search is handled properly' + ); + + # Enable auto-truncation t::lib::Mocks::mock_preference( 'QueryAutoTruncate', '1' ); ( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); -- 2.39.5