From 2293e6597c69d55ce5916b7a31029f13d65d4fea 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 --- .../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 1e76fe89cb..cde124940b 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -620,7 +620,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 @@ -727,6 +727,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; } @@ -799,7 +806,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; } @@ -867,6 +874,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 3b26c0958f..d3656eabc9 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 => 35; + plan tests => 40; my $qb; @@ -248,6 +248,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