FullSearchQueryParser.java
package access.api;
import access.exception.InvalidInputException;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class FullSearchQueryParser {
//SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
private static final Set<String> stopWords = Set.of(
"a", "about", "an", "are",
"as", "at", "be", "by",
"com", "de", "en", "for",
"from", "how", "i", "in",
"is", "it", "la", "of",
"on", "or", "that", "the",
"this", "to", "was", "what",
"when", "where", "who", "will",
"with", "und", "www"
);
private FullSearchQueryParser() {
}
public static String parse(String query) {
if (!StringUtils.hasText(query)) {
throw new InvalidInputException("Full text query parameter has @NotNull @NotBlank requirement");
}
String safeQuery = query.replaceAll("[<>()~\"]", " ");
String parsedQuery = Stream.of(safeQuery.split("[ @.,+*-]"))
.filter(part -> !(part.length() < 3 || stopWords.contains(part.toLowerCase())))
.map(part -> "+" + part)
.collect(Collectors.joining(" "));
if (parsedQuery.isEmpty()) {
throw new InvalidInputException("Search query contains no usable terms after filtering");
}
return parsedQuery + "*";
}
}