diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index ad339ae7e4..898fcd9956 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -1026,6 +1026,9 @@ sub clean_search_term { $term = $self->_convert_index_strings_freeform($term); + # escape special characters + $term = $self->_escape_special_characters($term); + # Remove unbalanced quotes my $unquoted = $term; my $count = ( $unquoted =~ tr/"/ / ); @@ -1114,6 +1117,30 @@ sub clean_search_term { return $term; } +=head2 _escape_special_characters + + $term = $self->_escape_special_characters($term); + +Escapes characters in $term according to "ElasticsearchEscapeCharacters" / +"OpacElasticsearchEscapeCharacters" system preference setting. + +=cut + +sub _escape_special_characters { + my ( $self, $term ) = @_; + my $characters_to_escape; + if ( C4::Context->interface eq 'opac' ) { + $characters_to_escape = C4::Context->preference('OpacElasticsearchEscapeCharacters'); + } else { + $characters_to_escape = C4::Context->preference('ElasticsearchEscapeCharacters'); + } + if ($characters_to_escape) { + $characters_to_escape =~ s/\s+//g; + $term =~ s/[\Q$characters_to_escape\E]/\\$&/g if $characters_to_escape; + } + return $term; +} + =head2 _query_regex_escape_process my $query = $self->_query_regex_escape_process($query);