From 8f8bcbbc0dc9f0f1145f7fd30f14749dcddfec26 Mon Sep 17 00:00:00 2001 From: Ere Maijala Date: Fri, 8 Mar 2019 13:27:26 +0200 Subject: [PATCH] Bug 22295: Make Elasticsearch query builder group multi-term queries Test plan: 1. Do an advanced search for Title = new AND Title = york 2. Verify that the results match an advanced search for: Title = new york 3. Verify that tests in t/db_dependent/Koha/SearchEngine/Elasticsearch still pass Signed-off-by: Michal Denar Signed-off-by: Josef Moravec Signed-off-by: Nick Clemens (cherry picked from commit e90cb16d79f611caa3cd6d6cbbca4ea01d7a8077) Signed-off-by: Martin Renvoize --- .../Elasticsearch/QueryBuilder.pm | 1 + .../SearchEngine/Elasticsearch/QueryBuilder.t | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 252416cbf8..2f47743f62 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -786,6 +786,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; "$otor($field$oand)"; } @queries; } diff --git a/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t b/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t index f3e7117a80..03d4d36999 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 => 26; + plan tests => 30; my $qb; @@ -224,6 +224,20 @@ subtest 'build_query tests' => sub { "query not altered if QueryAutoTruncate disabled" ); + ( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); + is( + $query->{query}{query_string}{query}, + '(title:(donald duck))', + 'multiple words in a query term are enclosed in parenthesis' + ); + + ( undef, $query ) = $qb->build_query_compat( ['AND'], ['donald duck', 'disney'], ['title', 'author'] ); + is( + $query->{query}{query_string}{query}, + '(title:(donald duck)) AND (author:disney)', + 'multiple query terms are enclosed in parenthesis while a single one is not' + ); + t::lib::Mocks::mock_preference( 'QueryAutoTruncate', '1' ); ( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); @@ -324,7 +338,21 @@ subtest 'build_query tests' => sub { is( $query->{query}{query_string}{query}, '(title:"donald duck")', - "query of specific field is not truncated when surrouned by quotes" + "query of specific field is not truncated when surrounded by quotes" + ); + + ( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); + is( + $query->{query}{query_string}{query}, + '(title:(donald* duck*))', + 'words of a multi-word term are properly truncated' + ); + + ( undef, $query ) = $qb->build_query_compat( ['AND'], ['donald duck', 'disney'], ['title', 'author'] ); + is( + $query->{query}{query_string}{query}, + '(title:(donald* duck*)) AND (author:disney*)', + 'words of a multi-word term and single-word term are properly truncated' ); ( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 1 } ); -- 2.39.5