This commit is contained in:
Stefan Hardegger
2025-07-24 16:25:23 +02:00
parent a38812877a
commit 12a8f2ee27
3 changed files with 111 additions and 38 deletions

View File

@@ -201,14 +201,14 @@ public class TypesenseService {
if (authorFilters != null && !authorFilters.isEmpty()) {
String authorFilter = authorFilters.stream()
.map(author -> "authorName:=" + author)
.map(author -> "authorName:=" + escapeTypesenseValue(author))
.collect(Collectors.joining(" || "));
filterConditions.add("(" + authorFilter + ")");
}
if (tagFilters != null && !tagFilters.isEmpty()) {
String tagFilter = tagFilters.stream()
.map(tag -> "tagNames:=" + tag)
.map(tag -> "tagNames:=" + escapeTypesenseValue(tag))
.collect(Collectors.joining(" || "));
filterConditions.add("(" + tagFilter + ")");
}
@@ -890,4 +890,31 @@ public class TypesenseService {
return Map.of("error", e.getMessage());
}
}
/**
* Escape special characters in Typesense filter values.
* Typesense requires certain characters to be escaped or quoted.
*/
private String escapeTypesenseValue(String value) {
if (value == null) {
return "";
}
// If the value contains spaces, special characters, or quotes, wrap it in backticks
if (value.contains(" ") || value.contains("'") || value.contains("\"") ||
value.contains("(") || value.contains(")") || value.contains("[") ||
value.contains("]") || value.contains("{") || value.contains("}") ||
value.contains(":") || value.contains("=") || value.contains("&") ||
value.contains("|") || value.contains("!") || value.contains("<") ||
value.contains(">") || value.contains("@") || value.contains("#") ||
value.contains("$") || value.contains("%") || value.contains("^") ||
value.contains("*") || value.contains("+") || value.contains("?") ||
value.contains("\\") || value.contains("/") || value.contains("~") ||
value.contains("`")) {
// Escape backticks in the value and wrap with backticks
return "`" + value.replace("`", "\\`") + "`";
}
return value;
}
}