From 2d7df14ed043b9fa1e230f75acff4aa05915b5d8 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Mon, 3 Apr 2017 14:30:44 -0400 Subject: [PATCH] Bug 18374 - Respect QueryAutoTruncate syspref in Elasticsearch This patchset adds a subroutine '_truncate_terms' to the ES QueryParser. If QueryAutoTruncate is enabled this function will be called for any search to add wildcard '*' to all terms To test: 1 - Enable Elasticsearch and have some records indexed 2 - Search for partial terms 3 - Note they fail unless '*' is appended 4 - Apply patch, leave QueryAutoTruncate disabled 5 - Note partial term searches still fail 6 - Enable QueryAutoTruncate 7 - Note partial term searches succeed 8 - Do some regular and advanced searches to make sure results are as expected https://bugs.koha-community.org/show_bug.cgi?id=18347 --- Koha/SearchEngine/Elasticsearch/QueryBuilder.pm | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index fbd4370..7ddeab8 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -83,6 +83,7 @@ sub build_query { my $fuzzy_enabled = C4::Context->preference("QueryFuzzy") || 0; $query = '*' unless defined $query; + $query = $self->_truncate_terms($query) if ( $auto_truncation ); my $res; $res->{query} = { @@ -779,4 +780,27 @@ sub _sort_field { return $f; } +=head2 _truncate_terms + + my $query = $self->_truncate_terms($query); + +Given a string query this function appends '*' wildcard to all terms except +operands. + +=cut + +sub _truncate_terms { + my ($self, $query) = @_; + my @stops = qw/and or not/; + my @new_terms; + my @split_query = split /[\(\s\)]/, $query ; + foreach my $term ( @split_query ) { + next if ($term eq '' || $term eq ' ' ) ; + $term .= "*" unless ( ( grep { $term =~ /$_/ } @stops ) || ($term =~ /\*$/ ) ); + push @new_terms, $term; + } + $query=join ' ' ,@new_terms; + return $query; +} + 1; -- 2.1.4