|
@@ -23,6 +23,7 @@ import org.apache.lucene.search.MatchAllDocsQuery;
|
|
|
import org.apache.lucene.search.MatchNoDocsQuery;
|
|
|
import org.apache.lucene.search.MultiTermQuery;
|
|
|
import org.apache.lucene.search.Query;
|
|
|
+import org.elasticsearch.Version;
|
|
|
import org.elasticsearch.common.ParseField;
|
|
|
import org.elasticsearch.common.ParsingException;
|
|
|
import org.elasticsearch.common.Strings;
|
|
@@ -59,6 +60,10 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
|
|
|
private String rewrite;
|
|
|
|
|
|
+ public static final boolean DEFAULT_CASE_INSENSITIVITY = false;
|
|
|
+ private static final ParseField CASE_INSENSITIVE_FIELD = new ParseField("case_insensitive");
|
|
|
+ private boolean caseInsensitive = DEFAULT_CASE_INSENSITIVITY;
|
|
|
+
|
|
|
/**
|
|
|
* Implements the wildcard search query. Supported wildcards are {@code *}, which
|
|
|
* matches any character sequence (including the empty one), and {@code ?},
|
|
@@ -89,6 +94,9 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
fieldName = in.readString();
|
|
|
value = in.readString();
|
|
|
rewrite = in.readOptionalString();
|
|
|
+ if (in.getVersion().onOrAfter(Version.V_8_0_0)) {
|
|
|
+ caseInsensitive = in.readBoolean();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -96,6 +104,9 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
out.writeString(fieldName);
|
|
|
out.writeString(value);
|
|
|
out.writeOptionalString(rewrite);
|
|
|
+ if (out.getVersion().onOrAfter(Version.V_8_0_0)) {
|
|
|
+ out.writeBoolean(caseInsensitive);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -115,6 +126,18 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
public String rewrite() {
|
|
|
return this.rewrite;
|
|
|
}
|
|
|
+
|
|
|
+ public WildcardQueryBuilder caseInsensitive(boolean caseInsensitive) {
|
|
|
+ if (caseInsensitive == false) {
|
|
|
+ throw new IllegalArgumentException("The case insensitive setting cannot be set to false.");
|
|
|
+ }
|
|
|
+ this.caseInsensitive = caseInsensitive;
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean caseInsensitive() {
|
|
|
+ return this.caseInsensitive;
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public String getWriteableName() {
|
|
@@ -129,6 +152,9 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
if (rewrite != null) {
|
|
|
builder.field(REWRITE_FIELD.getPreferredName(), rewrite);
|
|
|
}
|
|
|
+ if (caseInsensitive != DEFAULT_CASE_INSENSITIVITY) {
|
|
|
+ builder.field(CASE_INSENSITIVE_FIELD.getPreferredName(), caseInsensitive);
|
|
|
+ }
|
|
|
printBoostAndQueryName(builder);
|
|
|
builder.endObject();
|
|
|
builder.endObject();
|
|
@@ -139,6 +165,7 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
String rewrite = null;
|
|
|
String value = null;
|
|
|
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
|
|
+ boolean caseInsensitive = DEFAULT_CASE_INSENSITIVITY;
|
|
|
String queryName = null;
|
|
|
String currentFieldName = null;
|
|
|
XContentParser.Token token;
|
|
@@ -160,6 +187,12 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
boost = parser.floatValue();
|
|
|
} else if (REWRITE_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {
|
|
|
rewrite = parser.textOrNull();
|
|
|
+ } else if (CASE_INSENSITIVE_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {
|
|
|
+ caseInsensitive = parser.booleanValue();
|
|
|
+ if (caseInsensitive == false) {
|
|
|
+ throw new ParsingException(parser.getTokenLocation(),
|
|
|
+ "[prefix] query does not support [" + currentFieldName + "] = false");
|
|
|
+ }
|
|
|
} else if (AbstractQueryBuilder.NAME_FIELD.match(currentFieldName, parser.getDeprecationHandler())) {
|
|
|
queryName = parser.text();
|
|
|
} else {
|
|
@@ -175,10 +208,14 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return new WildcardQueryBuilder(fieldName, value)
|
|
|
+ WildcardQueryBuilder result = new WildcardQueryBuilder(fieldName, value)
|
|
|
.rewrite(rewrite)
|
|
|
.boost(boost)
|
|
|
.queryName(queryName);
|
|
|
+ if (caseInsensitive) {
|
|
|
+ result.caseInsensitive(caseInsensitive);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -192,7 +229,7 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
// This logic is correct for all field types, but by only applying it to constant
|
|
|
// fields we also have the guarantee that it doesn't perform I/O, which is important
|
|
|
// since rewrites might happen on a network thread.
|
|
|
- Query query = fieldType.wildcardQuery(value, null, context); // the rewrite method doesn't matter
|
|
|
+ Query query = fieldType.wildcardQuery(value, null, caseInsensitive, context); // the rewrite method doesn't matter
|
|
|
if (query instanceof MatchAllDocsQuery) {
|
|
|
return new MatchAllQueryBuilder();
|
|
|
} else if (query instanceof MatchNoDocsQuery) {
|
|
@@ -216,18 +253,19 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder<WildcardQueryBuil
|
|
|
|
|
|
MultiTermQuery.RewriteMethod method = QueryParsers.parseRewriteMethod(
|
|
|
rewrite, null, LoggingDeprecationHandler.INSTANCE);
|
|
|
- return fieldType.wildcardQuery(value, method, context);
|
|
|
+ return fieldType.wildcardQuery(value, method, caseInsensitive, context);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected int doHashCode() {
|
|
|
- return Objects.hash(fieldName, value, rewrite);
|
|
|
+ return Objects.hash(fieldName, value, rewrite, caseInsensitive);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected boolean doEquals(WildcardQueryBuilder other) {
|
|
|
return Objects.equals(fieldName, other.fieldName) &&
|
|
|
Objects.equals(value, other.value) &&
|
|
|
- Objects.equals(rewrite, other.rewrite);
|
|
|
+ Objects.equals(rewrite, other.rewrite)&&
|
|
|
+ Objects.equals(caseInsensitive, other.caseInsensitive);
|
|
|
}
|
|
|
}
|