Skip to content

Commit af11e3b

Browse files
committed
Add scorable() method to Query class, and take it into account for creating boolean queries
1 parent 338e82b commit af11e3b

File tree

5 files changed

+28
-3
lines changed

5 files changed

+28
-3
lines changed

x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/querydsl/query/BoolQuery.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,15 @@ public BoolQuery(Source source, boolean isAnd, List<Query> queries) {
4646
public QueryBuilder asBuilder() {
4747
BoolQueryBuilder boolQuery = boolQuery();
4848
for (Query query : queries) {
49+
QueryBuilder queryBuilder = query.asBuilder();
4950
if (isAnd) {
50-
boolQuery.must(query.asBuilder());
51+
if (query.scorable()) {
52+
boolQuery.must(queryBuilder);
53+
} else {
54+
boolQuery.filter(queryBuilder);
55+
}
5156
} else {
52-
boolQuery.should(query.asBuilder());
57+
boolQuery.should(queryBuilder);
5358
}
5459
}
5560
return boolQuery;

x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/querydsl/query/Query.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,13 @@ public String toString() {
8585
public Query negate(Source source) {
8686
return new NotQuery(source, this);
8787
}
88+
89+
/**
90+
* Defines whether a query should be scored or not
91+
*
92+
* @return true if the query should be scored
93+
*/
94+
public boolean scorable() {
95+
return false;
96+
}
8897
}

x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/util/Queries.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public static QueryBuilder combine(Clause clause, List<QueryBuilder> queries) {
5151
firstQuery = query;
5252
if (firstQuery instanceof BoolQueryBuilder bqb) {
5353
bool = bqb.shallowCopy();
54+
} else if (clause == Clause.FILTER) {
55+
// Filter is wrapped in a bool query to ensure scoring is not calculated
56+
bool = combine(clause, boolQuery(), query);
5457
}
5558
}
5659
// at least two entries, start copying

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ private static PhysicalPlan rewrite(
101101
if (newPushable.size() > 0) { // update the executable with pushable conditions
102102
Query queryDSL = TRANSLATOR_HANDLER.asQuery(Predicates.combineAnd(newPushable));
103103
QueryBuilder planQuery = queryDSL.asBuilder();
104-
Queries.Clause combiningQueryClauseType = queryExec.hasScoring() ? Queries.Clause.MUST : Queries.Clause.FILTER;
104+
Queries.Clause combiningQueryClauseType = queryExec.hasScoring() && queryDSL.scorable()
105+
? Queries.Clause.MUST
106+
: Queries.Clause.FILTER;
105107
var query = Queries.combine(combiningQueryClauseType, asList(queryExec.query(), planQuery));
106108
queryExec = new EsQueryExec(
107109
queryExec.source(),

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/querydsl/query/TranslationAwareExpressionQuery.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,10 @@ public QueryBuilder asBuilder() {
3434
protected String innerToString() {
3535
return queryBuilder.toString();
3636
}
37+
38+
@Override
39+
public boolean scorable() {
40+
// All Full Text Functions are translated to queries using this method
41+
return true;
42+
}
3743
}

0 commit comments

Comments
 (0)