Browse Source

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 <black23@gmail.com>

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

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
19.05.x
Ere Maijala 5 years ago
committed by Nick Clemens
parent
commit
e90cb16d79
  1. 1
      Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
  2. 32
      t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t

1
Koha/SearchEngine/Elasticsearch/QueryBuilder.pm

@ -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;
}

32
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 } );

Loading…
Cancel
Save