From 12d082506d084ad530ef27ded3c3d6087c1776f0 Mon Sep 17 00:00:00 2001
From: Janusz Kaczmarek <januszop@gmail.com>
Date: Tue, 4 Apr 2023 16:42:02 +0200
Subject: [PATCH] Bug 33407: With ES and QueryAutoTruncate on, a search
 containing ISBD punctuation returns no results

With ES and QueryAutoTruncate on, a search with punctuation surrounded
by spaces (like ISBD punctuation copied from other catalogue or
bibliography) returns no results.  E.g.: in a search for "Maria Stuart ;
Die Jungfrau von Orleans / Schiller" (coded in record as 245 10 $a Maria
Stuart ; $b Die Jungfrau von Orleans / $c Schiller) -- both semicolon
and slash cause problems.  One had to remove them manually to get
results which is not what is desired.

Test plan
=========
1. Use ktd with Elasticsearch and ktd's test data
   (http://localhost:8081/cgi-bin/koha/catalogue/detail.pl?biblionumber=1):
2. Make a search for the first ISBD zone taken verbatim from the first record:
   E Street shuffle : the glory days of Bruce Springsteen & the E Street Band / Clinton Heylin

   There should be no result.
3. Apply teh patch, restart plack.
4. Repeat the search. You should get the record (and onother one).

Sponsored-by: Ignatianum University in Cracow
Signed-off-by: Roman Dolny <roman.dolny@jezuici.pl>
---
 Koha/SearchEngine/Elasticsearch/QueryBuilder.pm | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
index edde18cc09..2c5e464cd2 100644
--- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
+++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
@@ -1024,6 +1024,9 @@ sub clean_search_term {
     # screen all brackets with backslash
     $term =~ s/(?<!\\)(?:[\\]{2})*([\{\}\[\]])$lookahead/\\$1/g;
 
+    # remove problematic punctuation and escaped slashes surrounded by spaces if truncate
+    $term =~ s/\s+(\s*[&;,:\.=\-\/]|(\\\/)\s*)+\s$lookahead/ /g if $truncate;
+
     # restore all regex contents after escaping brackets:
     for (my $i = 0; $i < @saved_regexes; $i++) {
         $term =~ s/~~RE$i~~/$saved_regexes[$i]/;
-- 
2.39.2