Skip to content

Commit 0accbe2

Browse files
combine logic to simplify best fields and most fields
1 parent 13cd7c0 commit 0accbe2

File tree

1 file changed

+29
-74
lines changed

1 file changed

+29
-74
lines changed

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMultiMatchQueryRewriteInterceptor.java

Lines changed: 29 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package org.elasticsearch.xpack.inference.queries;
99

1010
import org.elasticsearch.features.NodeFeature;
11-
import org.elasticsearch.index.query.BoolQueryBuilder;
1211
import org.elasticsearch.index.query.DisMaxQueryBuilder;
1312
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
1413
import org.elasticsearch.index.query.QueryBuilder;
@@ -153,100 +152,56 @@ private SemanticQueryBuilder createSemanticQuery(String fieldName, String queryV
153152
}
154153

155154
/**
156-
* Builds a semantic query for multiple fields.
157-
* Uses BoolQuery when minimum_should_match is specified, otherwise uses DisMax with appropriate tie_breaker.
155+
* Builds a semantic query for multiple fields using Dismax.
158156
*/
159157
private QueryBuilder buildSemanticQuery(
160158
MultiMatchQueryBuilder originalQuery,
161159
InferenceIndexInformationForField indexInformation,
162160
Set<String> inferenceFields,
163161
String queryValue
164162
) {
165-
String minimumShouldMatch = originalQuery.minimumShouldMatch();
166-
167-
if (minimumShouldMatch != null) {
168-
// Use BoolQuery when minimum_should_match is specified
169-
BoolQueryBuilder boolQuery = new BoolQueryBuilder();
170-
for (String fieldName : inferenceFields) {
171-
boolQuery.should(createSemanticQuery(fieldName, queryValue, indexInformation));
172-
}
173-
boolQuery.minimumShouldMatch(minimumShouldMatch);
174-
boolQuery.boost(originalQuery.boost());
175-
boolQuery.queryName(originalQuery.queryName());
176-
return boolQuery;
177-
} else {
178-
// Use DisMax for default behavior with tie_breaker
179-
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
180-
for (String fieldName : inferenceFields) {
181-
disMaxQuery.add(createSemanticQuery(fieldName, queryValue, indexInformation));
182-
}
183-
// Apply tie_breaker - use explicit value or fall back to type's default
184-
Float tieBreaker = originalQuery.tieBreaker();
185-
disMaxQuery.tieBreaker(Objects.requireNonNullElseGet(tieBreaker, () -> originalQuery.type().tieBreaker()));
186-
disMaxQuery.boost(originalQuery.boost());
187-
disMaxQuery.queryName(originalQuery.queryName());
188-
return disMaxQuery;
163+
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
164+
for (String fieldName : inferenceFields) {
165+
disMaxQuery.add(createSemanticQuery(fieldName, queryValue, indexInformation));
189166
}
167+
168+
// Apply tie_breaker - use explicit value or fall back to type's default
169+
Float tieBreaker = originalQuery.tieBreaker();
170+
disMaxQuery.tieBreaker(Objects.requireNonNullElseGet(tieBreaker, () -> originalQuery.type().tieBreaker()));
171+
disMaxQuery.boost(originalQuery.boost());
172+
disMaxQuery.queryName(originalQuery.queryName());
173+
return disMaxQuery;
190174
}
191175

192176
/**
193177
* Builds a combined query for both inference and non-inference fields.
194-
* Uses BoolQuery when minimum_should_match is specified, otherwise uses DisMax for BEST_FIELDS
195-
* and BoolQuery for MOST_FIELDS to match core multi_match behavior.
196178
*/
197179
private QueryBuilder buildCombinedQuery(
198180
MultiMatchQueryBuilder originalQuery,
199181
InferenceIndexInformationForField inferenceInfo,
200182
String queryValue
201183
) {
202-
String minimumShouldMatch = originalQuery.minimumShouldMatch();
203-
boolean isMostFields = originalQuery.type() == MultiMatchQueryBuilder.Type.MOST_FIELDS;
204-
205-
if (minimumShouldMatch != null || isMostFields) {
206-
// Use BoolQuery when minimum_should_match is specified or for MOST_FIELDS
207-
BoolQueryBuilder boolQuery = new BoolQueryBuilder();
208-
209-
// Add semantic queries
210-
for (String fieldName : inferenceInfo.getAllInferenceFields()) {
211-
Set<String> semanticIndices = inferenceInfo.getInferenceIndicesForField(fieldName);
212-
if (semanticIndices.isEmpty() == false) {
213-
boolQuery.should(
214-
createSemanticSubQuery(semanticIndices, fieldName, queryValue).boost(inferenceInfo.getFieldBoost(fieldName))
215-
);
216-
}
217-
}
218-
219-
// Add non-inference queries
220-
addNonInferenceQueries(boolQuery::should, originalQuery, inferenceInfo);
221-
222-
// Set minimum_should_match - default to "1" for MOST_FIELDS when not specified
223-
boolQuery.minimumShouldMatch(Objects.requireNonNullElse(minimumShouldMatch, "1"));
224-
boolQuery.boost(originalQuery.boost());
225-
boolQuery.queryName(originalQuery.queryName());
226-
return boolQuery;
227-
} else {
228-
// Use DisMaxQuery for BEST_FIELDS without minimum_should_match
229-
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
230-
231-
// Add semantic queries
232-
for (String fieldName : inferenceInfo.getAllInferenceFields()) {
233-
Set<String> semanticIndices = inferenceInfo.getInferenceIndicesForField(fieldName);
234-
if (semanticIndices.isEmpty() == false) {
235-
disMaxQuery.add(
236-
createSemanticSubQuery(semanticIndices, fieldName, queryValue).boost(inferenceInfo.getFieldBoost(fieldName))
237-
);
238-
}
184+
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
185+
186+
// Add semantic queries
187+
for (String fieldName : inferenceInfo.getAllInferenceFields()) {
188+
Set<String> semanticIndices = inferenceInfo.getInferenceIndicesForField(fieldName);
189+
if (semanticIndices.isEmpty() == false) {
190+
disMaxQuery.add(
191+
createSemanticSubQuery(semanticIndices, fieldName, queryValue).boost(inferenceInfo.getFieldBoost(fieldName))
192+
);
239193
}
194+
}
240195

241-
// Add non-inference queries
242-
addNonInferenceQueries(disMaxQuery::add, originalQuery, inferenceInfo);
196+
// Add non-inference queries
197+
addNonInferenceQueries(disMaxQuery::add, originalQuery, inferenceInfo);
243198

244-
Float tieBreaker = originalQuery.tieBreaker();
245-
disMaxQuery.tieBreaker(Objects.requireNonNullElseGet(tieBreaker, () -> originalQuery.type().tieBreaker()));
246-
disMaxQuery.boost(originalQuery.boost());
247-
disMaxQuery.queryName(originalQuery.queryName());
248-
return disMaxQuery;
249-
}
199+
// Apply tie_breaker - use explicit value or fall back to type's default
200+
Float tieBreaker = originalQuery.tieBreaker();
201+
disMaxQuery.tieBreaker(Objects.requireNonNullElseGet(tieBreaker, () -> originalQuery.type().tieBreaker()));
202+
disMaxQuery.boost(originalQuery.boost());
203+
disMaxQuery.queryName(originalQuery.queryName());
204+
return disMaxQuery;
250205
}
251206

252207
private void addNonInferenceQueries(

0 commit comments

Comments
 (0)