|
8 | 8 | package org.elasticsearch.xpack.inference.queries; |
9 | 9 |
|
10 | 10 | import org.elasticsearch.features.NodeFeature; |
11 | | -import org.elasticsearch.index.query.BoolQueryBuilder; |
12 | 11 | import org.elasticsearch.index.query.DisMaxQueryBuilder; |
13 | 12 | import org.elasticsearch.index.query.MultiMatchQueryBuilder; |
14 | 13 | import org.elasticsearch.index.query.QueryBuilder; |
@@ -153,100 +152,56 @@ private SemanticQueryBuilder createSemanticQuery(String fieldName, String queryV |
153 | 152 | } |
154 | 153 |
|
155 | 154 | /** |
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. |
158 | 156 | */ |
159 | 157 | private QueryBuilder buildSemanticQuery( |
160 | 158 | MultiMatchQueryBuilder originalQuery, |
161 | 159 | InferenceIndexInformationForField indexInformation, |
162 | 160 | Set<String> inferenceFields, |
163 | 161 | String queryValue |
164 | 162 | ) { |
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)); |
189 | 166 | } |
| 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; |
190 | 174 | } |
191 | 175 |
|
192 | 176 | /** |
193 | 177 | * 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. |
196 | 178 | */ |
197 | 179 | private QueryBuilder buildCombinedQuery( |
198 | 180 | MultiMatchQueryBuilder originalQuery, |
199 | 181 | InferenceIndexInformationForField inferenceInfo, |
200 | 182 | String queryValue |
201 | 183 | ) { |
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 | + ); |
239 | 193 | } |
| 194 | + } |
240 | 195 |
|
241 | | - // Add non-inference queries |
242 | | - addNonInferenceQueries(disMaxQuery::add, originalQuery, inferenceInfo); |
| 196 | + // Add non-inference queries |
| 197 | + addNonInferenceQueries(disMaxQuery::add, originalQuery, inferenceInfo); |
243 | 198 |
|
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; |
250 | 205 | } |
251 | 206 |
|
252 | 207 | private void addNonInferenceQueries( |
|
0 commit comments