From 5785656f23f070829f7747159d3cef2ead349351 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 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 in advanced search: yyyy yyyy-yyyy -yyyy yyyy- Note that bug 22413 is needed for paging etc. to work properly. --- .../Elasticsearch/QueryBuilder.pm | 12 +++++-- .../searchengine/elasticsearch/mappings.yaml | 4 +-- .../SearchEngine/Elasticsearch/QueryBuilder.t | 31 ++++++++++++++++++- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 1560d16ea0..31dd0a1397 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -608,7 +608,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 @@ -715,6 +715,14 @@ sub _modify_string_by_type { $str .= '*' if $type eq 'right-truncate'; $str = '"' . $str . '"' if $type eq 'phrase'; + if ($type eq 'st-year') { + my ($from, $until); + if ($str =~ /^(.*)-(.*)$/) { + $from = $1 || '*'; + $until = $2 || '*'; + $str = "[$from TO $until]"; + } + } return $str; } @@ -787,7 +795,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 && $_->{type} ne 'st-year'; "$otor($field$oand)"; } @queries; } diff --git a/admin/searchengine/elasticsearch/mappings.yaml b/admin/searchengine/elasticsearch/mappings.yaml index 8ead46bd59..371dc4e729 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 03d4d36999..76dc1bb39d 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 => 30; + plan tests => 34; my $qb; @@ -238,6 +238,35 @@ subtest 'build_query tests' => sub { 'multiple query terms are enclosed in parenthesis while a single one is not' ); + ( 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' + ); + + # Enable auto-truncation t::lib::Mocks::mock_preference( 'QueryAutoTruncate', '1' ); ( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); -- 2.17.1