add keyword fields for exact search via field name
This commit is contained in:
parent
a52894f663
commit
04d19b3ed7
2 changed files with 120 additions and 89 deletions
|
@ -142,10 +142,18 @@ public class QueryGenerator implements Visitor {
|
||||||
if (!visible) {
|
if (!visible) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
String field = arg1.toString();
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case EQUALS: {
|
case EQUALS: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = arg2 != null ? arg2.toString() : ""; // with quote
|
String value = arg2 != null ? arg2.toString() : ""; // with quote
|
||||||
|
if (field.endsWith("Keyword")) {
|
||||||
|
// exact search
|
||||||
|
builder.beginMap()
|
||||||
|
.beginMap("term")
|
||||||
|
.field(field, value)
|
||||||
|
.endMap()
|
||||||
|
.endMap();
|
||||||
|
} else {
|
||||||
// with phrase boost
|
// with phrase boost
|
||||||
builder.beginMap("bool")
|
builder.beginMap("bool")
|
||||||
.beginCollection("should")
|
.beginCollection("should")
|
||||||
|
@ -167,11 +175,21 @@ public class QueryGenerator implements Visitor {
|
||||||
.endCollection()
|
.endCollection()
|
||||||
.field("minimum_should_match", "1")
|
.field("minimum_should_match", "1")
|
||||||
.endMap();
|
.endMap();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NOT_EQUALS: {
|
case NOT_EQUALS: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = arg2 != null ? arg2.toString() : ""; // with quote
|
String value = arg2 != null ? arg2.toString() : ""; // with quote
|
||||||
|
if (field.endsWith("Keyword")) {
|
||||||
|
// exact search
|
||||||
|
builder.beginMap("bool")
|
||||||
|
.beginMap("must_not")
|
||||||
|
.beginMap("term")
|
||||||
|
.field(field, value)
|
||||||
|
.endMap()
|
||||||
|
.endMap()
|
||||||
|
.endMap();
|
||||||
|
} else {
|
||||||
builder.beginMap("bool")
|
builder.beginMap("bool")
|
||||||
.beginMap("must_not")
|
.beginMap("must_not")
|
||||||
.beginMap("simple_query_string")
|
.beginMap("simple_query_string")
|
||||||
|
@ -182,11 +200,17 @@ public class QueryGenerator implements Visitor {
|
||||||
.endMap()
|
.endMap()
|
||||||
.endMap()
|
.endMap()
|
||||||
.endMap();
|
.endMap();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ALL: {
|
case ALL: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = tok2 != null ? tok2.getString() : ""; // always unquoted
|
String value = tok2 != null ? tok2.getString() : ""; // always unquoted
|
||||||
|
if (field.endsWith("Keyword")) {
|
||||||
|
// exact search
|
||||||
|
builder.beginMap("term")
|
||||||
|
.field(field, value)
|
||||||
|
.endMap();
|
||||||
|
} else {
|
||||||
// with phrase boost
|
// with phrase boost
|
||||||
builder.beginMap("bool")
|
builder.beginMap("bool")
|
||||||
.beginCollection("should")
|
.beginCollection("should")
|
||||||
|
@ -208,11 +232,17 @@ public class QueryGenerator implements Visitor {
|
||||||
.endCollection()
|
.endCollection()
|
||||||
.field("minimum_should_match", "1")
|
.field("minimum_should_match", "1")
|
||||||
.endMap();
|
.endMap();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ANY: {
|
case ANY: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = tok2 != null ? tok2.getString() : ""; // always unquoted
|
String value = tok2 != null ? tok2.getString() : ""; // always unquoted
|
||||||
|
if (field.endsWith("Keyword")) {
|
||||||
|
// exact search
|
||||||
|
builder.beginMap("term")
|
||||||
|
.field(field, value)
|
||||||
|
.endMap();
|
||||||
|
} else {
|
||||||
// with phrase boost
|
// with phrase boost
|
||||||
builder.beginMap("bool")
|
builder.beginMap("bool")
|
||||||
.beginCollection("should")
|
.beginCollection("should")
|
||||||
|
@ -232,11 +262,11 @@ public class QueryGenerator implements Visitor {
|
||||||
.endCollection()
|
.endCollection()
|
||||||
.field("minimum_should_match", "1")
|
.field("minimum_should_match", "1")
|
||||||
.endMap();
|
.endMap();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PHRASE: {
|
case PHRASE: {
|
||||||
if (tok2 != null) {
|
if (tok2 != null) {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = tok2.isQuoted() ? tok2.getString() : arg2.toString();
|
String value = tok2.isQuoted() ? tok2.getString() : arg2.toString();
|
||||||
if (tok2.isAll()) {
|
if (tok2.isAll()) {
|
||||||
builder.beginMap("match_all").endMap();
|
builder.beginMap("match_all").endMap();
|
||||||
|
@ -244,6 +274,12 @@ public class QueryGenerator implements Visitor {
|
||||||
builder.beginMap("wildcard").field(field, value).endMap();
|
builder.beginMap("wildcard").field(field, value).endMap();
|
||||||
} else if (tok2.isBoundary()) {
|
} else if (tok2.isBoundary()) {
|
||||||
builder.beginMap("prefix").field(field, value).endMap();
|
builder.beginMap("prefix").field(field, value).endMap();
|
||||||
|
} else {
|
||||||
|
if (field.endsWith("Keyword")) {
|
||||||
|
// exact search
|
||||||
|
builder.beginMap("term")
|
||||||
|
.field(field, value)
|
||||||
|
.endMap();
|
||||||
} else {
|
} else {
|
||||||
builder.beginMap("simple_query_string")
|
builder.beginMap("simple_query_string")
|
||||||
.field("query", value)
|
.field("query", value)
|
||||||
|
@ -253,10 +289,10 @@ public class QueryGenerator implements Visitor {
|
||||||
.endMap();
|
.endMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RANGE_GREATER_THAN: {
|
case RANGE_GREATER_THAN: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = arg2 != null ? arg2.toString() : "";
|
String value = arg2 != null ? arg2.toString() : "";
|
||||||
builder.beginMap("range").beginMap(field)
|
builder.beginMap("range").beginMap(field)
|
||||||
.field("from", value)
|
.field("from", value)
|
||||||
|
@ -265,7 +301,6 @@ public class QueryGenerator implements Visitor {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RANGE_GREATER_OR_EQUAL: {
|
case RANGE_GREATER_OR_EQUAL: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = arg2 != null ? arg2.toString() : "";
|
String value = arg2 != null ? arg2.toString() : "";
|
||||||
builder.beginMap("range").beginMap(field)
|
builder.beginMap("range").beginMap(field)
|
||||||
.field("from", value)
|
.field("from", value)
|
||||||
|
@ -274,7 +309,6 @@ public class QueryGenerator implements Visitor {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RANGE_LESS_THAN: {
|
case RANGE_LESS_THAN: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = arg2 != null ? arg2.toString() : "";
|
String value = arg2 != null ? arg2.toString() : "";
|
||||||
builder.beginMap("range").beginMap(field)
|
builder.beginMap("range").beginMap(field)
|
||||||
.field("to", value)
|
.field("to", value)
|
||||||
|
@ -283,7 +317,6 @@ public class QueryGenerator implements Visitor {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RANGE_LESS_OR_EQUALS: {
|
case RANGE_LESS_OR_EQUALS: {
|
||||||
String field = arg1.toString();
|
|
||||||
String value = arg2 != null ? arg2.toString() : "";
|
String value = arg2 != null ? arg2.toString() : "";
|
||||||
builder.beginMap("range").beginMap(field)
|
builder.beginMap("range").beginMap(field)
|
||||||
.field("to", value)
|
.field("to", value)
|
||||||
|
@ -293,7 +326,6 @@ public class QueryGenerator implements Visitor {
|
||||||
}
|
}
|
||||||
case RANGE_WITHIN: {
|
case RANGE_WITHIN: {
|
||||||
// borders are inclusive
|
// borders are inclusive
|
||||||
String field = arg1.toString();
|
|
||||||
String value = arg2 != null ? arg2.toString() : "";
|
String value = arg2 != null ? arg2.toString() : "";
|
||||||
String from = null;
|
String from = null;
|
||||||
String to = null;
|
String to = null;
|
||||||
|
@ -397,7 +429,6 @@ public class QueryGenerator implements Visitor {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PROX: {
|
case PROX: {
|
||||||
String field = arg1.toString();
|
|
||||||
// we assume a default of 10 words is enough for proximity
|
// we assume a default of 10 words is enough for proximity
|
||||||
String value = arg2 != null ? arg2 + "~10" : "";
|
String value = arg2 != null ? arg2 + "~10" : "";
|
||||||
builder.beginMap("field").field(field, value).endMap();
|
builder.beginMap("field").field(field, value).endMap();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
group = org.xbib
|
group = org.xbib
|
||||||
name = cql
|
name = cql
|
||||||
version = 4.0.0
|
version = 4.0.1
|
||||||
|
|
||||||
gradle.wrapper.version = 6.6.1
|
gradle.wrapper.version = 6.6.1
|
||||||
xbib-datastructures.version = 1.0.0
|
xbib-datastructures.version = 1.0.0
|
||||||
|
|
Loading…
Reference in a new issue