Skip to content

Commit 9a03651

Browse files
query type
1 parent 9d9bdf6 commit 9a03651

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import org.elasticsearch.action.ResolvedIndices;
1111
import org.elasticsearch.cluster.metadata.IndexMetadata;
1212
import org.elasticsearch.index.query.BoolQueryBuilder;
13+
import org.elasticsearch.index.query.DisMaxQueryBuilder;
1314
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
1415
import org.elasticsearch.index.query.QueryBuilder;
16+
import org.elasticsearch.index.query.QueryBuilders;
1517
import org.elasticsearch.index.query.QueryRewriteContext;
1618
import org.elasticsearch.plugins.internal.rewriter.QueryRewriteInterceptor;
1719

@@ -58,6 +60,38 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde
5860
return queryBuilder;
5961
}
6062

63+
MultiMatchQueryBuilder.Type type = multiMatchBuilder.type();
64+
if (type == MultiMatchQueryBuilder.Type.CROSS_FIELDS ||
65+
type == MultiMatchQueryBuilder.Type.PHRASE ||
66+
type == MultiMatchQueryBuilder.Type.PHRASE_PREFIX) {
67+
throw new IllegalArgumentException("Query type [" + type.parseField().getPreferredName() + "] is not supported with semantic_text fields");
68+
}
69+
70+
if (type == MultiMatchQueryBuilder.Type.BEST_FIELDS) {
71+
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
72+
if (otherFields.isEmpty() == false) {
73+
MultiMatchQueryBuilder lexicalPart = new MultiMatchQueryBuilder(multiMatchBuilder.value());
74+
lexicalPart.fields(otherFields);
75+
lexicalPart.type(multiMatchBuilder.type());
76+
disMaxQuery.add(lexicalPart);
77+
}
78+
for (Map.Entry<String, Float> fieldEntry : semanticFields.entrySet()) {
79+
SemanticQueryBuilder semanticQuery = new SemanticQueryBuilder(fieldEntry.getKey(), multiMatchBuilder.value().toString(), true);
80+
if (fieldEntry.getValue() != 1.0f) {
81+
semanticQuery.boost(fieldEntry.getValue());
82+
}
83+
disMaxQuery.add(semanticQuery);
84+
}
85+
Float tieBreaker = multiMatchBuilder.tieBreaker();
86+
if (tieBreaker != null) {
87+
disMaxQuery.tieBreaker(tieBreaker);
88+
}
89+
disMaxQuery.boost(multiMatchBuilder.boost());
90+
disMaxQuery.queryName(multiMatchBuilder.queryName());
91+
return disMaxQuery;
92+
}
93+
94+
// Fallback for other types like MOST_FIELDS and BOOL_PREFIX
6195
BoolQueryBuilder rewrittenQuery = new BoolQueryBuilder();
6296
if (otherFields.isEmpty() == false) {
6397
MultiMatchQueryBuilder lexicalPart = new MultiMatchQueryBuilder(multiMatchBuilder.value());

0 commit comments

Comments
 (0)