19 package org.sleuthkit.autopsy.keywordsearch.multicase;
21 import javax.annotation.concurrent.Immutable;
28 final class SearchQuery {
30 private static final String SEARCH_TERM_CHARS_TO_ESCAPE =
"/+-&|!(){}[]^\"~*?:\\";
31 private static final String SOLR_DOC_CONTENT_STR_FIELD = Server.
Schema.CONTENT_STR.toString();
32 private final String searchTerm;
40 SearchQuery(QueryType queryType, String searchTerm) {
43 this.searchTerm = prepareExactMatchSearchTerm(searchTerm);
46 this.searchTerm = prepareSubstringSearchTerm(searchTerm);
49 this.searchTerm = prepareRegexSearchTerm(searchTerm);
52 this.searchTerm = searchTerm;
62 String getSearchTerm() {
74 private static String prepareExactMatchSearchTerm(String searchTerm) {
75 String escapedSearchTerm = escapeSearchTerm(searchTerm);
76 if (!searchTerm.startsWith(
"\"")) {
77 escapedSearchTerm =
"\"" + escapedSearchTerm;
79 if (!searchTerm.endsWith(
"\"")) {
80 escapedSearchTerm +=
"\"";
82 return escapedSearchTerm;
93 private static String prepareRegexSearchTerm(String searchTerm) {
102 String regexSearchTerm = SOLR_DOC_CONTENT_STR_FIELD
104 + (searchTerm.startsWith(
".*") ?
"" :
".*")
105 + searchTerm.toLowerCase()
106 + (searchTerm.endsWith(
".*") ?
"" :
".*")
108 return regexSearchTerm;
119 private static String prepareSubstringSearchTerm(String searchTerm) {
120 String escapedSearchTerm = escapeSearchTerm(searchTerm);
121 return prepareRegexSearchTerm(escapedSearchTerm);
131 public static String escapeSearchTerm(String searchTerm) {
132 String rawSearchTerm = searchTerm.trim();
133 if (0 == rawSearchTerm.length()) {
134 return rawSearchTerm;
136 StringBuilder escapedSearchTerm =
new StringBuilder(rawSearchTerm.length());
137 for (
int i = 0; i < rawSearchTerm.length(); ++i) {
138 final char nextChar = rawSearchTerm.charAt(i);
139 if (SEARCH_TERM_CHARS_TO_ESCAPE.contains(Character.toString(nextChar))) {
140 escapedSearchTerm.append(
"\\");
142 escapedSearchTerm.append(nextChar);
144 return escapedSearchTerm.toString();