Bug 22295: Make Elasticsearch query builder group multi-term queries
authorEre Maijala <ere.maijala@helsinki.fi>
Fri, 8 Mar 2019 11:27:26 +0000 (13:27 +0200)
committerNick Clemens <nick@bywatersolutions.com>
Wed, 10 Apr 2019 20:09:10 +0000 (20:09 +0000)
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 <black23@gmail.com>

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t

index 9033148..1560d16 100644 (file)
@@ -787,6 +787,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;
 }
index f3e7117..03d4d36 100644 (file)
@@ -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 } );