i2psnark, susimail: Normailze strings when searching (Gitlab #488)

to improve search for non-ASCII strings.
Normalize both search and searched strings to NFKD when searching.
NFKD is best because it is more efficient than NFKC and it removes
formatting distinctions. This results in the best fuzzy matching.
This commit is contained in:
zzz
2024-08-09 09:37:50 -04:00
parent 181d5da2e2
commit 5a3a7b24af
2 changed files with 8 additions and 6 deletions
@@ -13,6 +13,7 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.text.Collator;
import java.text.DecimalFormat;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -875,14 +876,14 @@ public class I2PSnarkServlet extends BasicServlet {
if (term.length() > 0) {
if (searchList == null)
searchList = new ArrayList<String>(4);
searchList.add(term.toLowerCase(Locale.US));
searchList.add(Normalizer.normalize(term.toLowerCase(Locale.US), Normalizer.Form.NFKD));
}
}
if (searchList == null)
return null;
List<Snark> matches = new ArrayList<Snark>(32);
for (Snark snark : snarks) {
String lcname = snark.getBaseName().toLowerCase(Locale.US);
String lcname = Normalizer.normalize(snark.getBaseName().toLowerCase(Locale.US), Normalizer.Form.NFKD);
// search for any term (OR)
for (int j = 0; j < searchList.size(); j++) {
String term = searchList.get(j);
@@ -62,6 +62,7 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.text.Collator;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
@@ -3851,7 +3852,7 @@ public class WebMail extends HttpServlet
terms = DataHelper.split(search, " ");
// decode
for (int i = 0; i < terms.length; i++) {
terms[i] = terms[i].toLowerCase(Locale.US);
terms[i] = Normalizer.normalize(terms[i].toLowerCase(Locale.US), Normalizer.Form.NFKD);
}
}
@@ -3863,10 +3864,10 @@ public class WebMail extends HttpServlet
Mail mail = mc.getMail(uidl, MailCache.FetchMode.HEADER_CACHE_ONLY);
if (mail == null)
return false;
String subj = mail.subject.toLowerCase(Locale.US);
String subj = Normalizer.normalize(mail.subject.toLowerCase(Locale.US), Normalizer.Form.NFKD);
String sender = isDrafts ? null : mail.sender;
if (sender != null)
sender = sender.toLowerCase(Locale.US);
sender = Normalizer.normalize(sender.toLowerCase(Locale.US), Normalizer.Form.NFKD);
String[] to = isDrafts ? mail.to : null;
for (String term : terms) {
if (subj.contains(term))
@@ -3875,7 +3876,7 @@ public class WebMail extends HttpServlet
return true;
if (to != null) {
for (int i = 0; i < to.length; i++) {
if (to[i].toLowerCase(Locale.US).contains(term))
if (Normalizer.normalize(to[i].toLowerCase(Locale.US), Normalizer.Form.NFKD).contains(term))
return true;
}
}