From faa2689754095e75bda083289a438d72b50a2f64 Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Fri, 30 May 2025 16:41:03 -0400 Subject: [PATCH 01/13] initial implementation for match_All --- .../xpack/inference/InferencePlugin.java | 2 + ...manticMatchAllQueryRewriteInterceptor.java | 61 +++++++++++++++++++ .../SemanticQueryRewriteInterceptor.java | 58 ++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java index 87256494a60e0..53c26c8514375 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java @@ -93,6 +93,7 @@ import org.elasticsearch.xpack.inference.mapper.SemanticInferenceMetadataFieldsMapper; import org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper; import org.elasticsearch.xpack.inference.queries.SemanticKnnVectorQueryRewriteInterceptor; +import org.elasticsearch.xpack.inference.queries.SemanticMatchAllQueryRewriteInterceptor; import org.elasticsearch.xpack.inference.queries.SemanticMatchQueryRewriteInterceptor; import org.elasticsearch.xpack.inference.queries.SemanticQueryBuilder; import org.elasticsearch.xpack.inference.queries.SemanticSparseVectorQueryRewriteInterceptor; @@ -547,6 +548,7 @@ public List getQueryRewriteInterceptors() { return List.of( new SemanticKnnVectorQueryRewriteInterceptor(), new SemanticMatchQueryRewriteInterceptor(), + new SemanticMatchAllQueryRewriteInterceptor(), new SemanticSparseVectorQueryRewriteInterceptor() ); } diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java new file mode 100644 index 0000000000000..7ec4cf193e77c --- /dev/null +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.inference.queries; + +import org.elasticsearch.features.NodeFeature; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MatchAllQueryBuilder; +import org.elasticsearch.index.query.MatchQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; + +public class SemanticMatchAllQueryRewriteInterceptor extends SemanticQueryRewriteInterceptor{ + + public static final NodeFeature SEMANTIC_MATCH_ALL_QUERY_REWRITE_INTERCEPTION_SUPPORTED = new NodeFeature( + "search.semantic_match_all_query_rewrite_interception_supported" + ); + + public SemanticMatchAllQueryRewriteInterceptor() {} + + @Override + protected String getFieldName(QueryBuilder queryBuilder) { + assert (queryBuilder instanceof MatchAllQueryBuilder); + return null; // MatchAllQueryBuilder does not have a field name, it matches all documents + } + + @Override + protected String getQuery(QueryBuilder queryBuilder) { + return "*"; // MatchAllQueryBuilder does not have a specific query, it matches all documents + } + + @Override + protected QueryBuilder buildInferenceQuery(QueryBuilder queryBuilder, InferenceIndexInformationForField indexInformation) { + return new SemanticQueryBuilder(indexInformation.fieldName(), getQuery(queryBuilder), false); + } + + @Override + protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery(QueryBuilder queryBuilder, InferenceIndexInformationForField indexInformation) { + assert (queryBuilder instanceof MatchAllQueryBuilder); + MatchAllQueryBuilder matchAllQueryBuilder = (MatchAllQueryBuilder) queryBuilder; + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + boolQueryBuilder.should( + createSemanticSubQuery( + indexInformation.getInferenceIndices(), + indexInformation.fieldName(), + getQuery(queryBuilder) + ) + ); + boolQueryBuilder.should(createSubQueryForIndices(indexInformation.nonInferenceIndices(), matchAllQueryBuilder)); + return boolQueryBuilder; + } + + @Override + public String getQueryName() { + return MatchAllQueryBuilder.NAME; + } +} diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java index bb76ef0be24e9..79085c9bf6c5e 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java @@ -12,6 +12,7 @@ import org.elasticsearch.cluster.metadata.InferenceFieldMetadata; import org.elasticsearch.index.mapper.IndexFieldMapper; import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryRewriteContext; import org.elasticsearch.index.query.TermsQueryBuilder; @@ -22,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -41,6 +43,31 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde return queryBuilder; } + if (fieldName == null && getQueryName().equals(MatchAllQueryBuilder.NAME)) { + + if (getInferenceFieldsFromResolveIndices(resolvedIndices).isEmpty()) { + // No inference fields were identified, so return the original query. + return queryBuilder; + } + + List fieldList = new ArrayList<>(getFieldsFromResolveIndices(resolvedIndices)); + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + for (String field : fieldList) { + InferenceIndexInformationForField indexInformation = resolveIndicesForField(field, resolvedIndices); + if (indexInformation.nonInferenceIndices().isEmpty() == false) { + // Combined case where the field name requested by this query contains both + // semantic_text and non-inference fields, so we have to combine queries per index + // containing each field type. + boolQueryBuilder.should(buildCombinedInferenceAndNonInferenceQuery(queryBuilder, indexInformation)); + } else { + // The only fields we've identified are inference fields (e.g. semantic_text), + // so rewrite the entire query to work on a semantic_text field. + boolQueryBuilder.should(buildInferenceQuery(queryBuilder, indexInformation)); + } + } + return boolQueryBuilder; + } + InferenceIndexInformationForField indexInformation = resolveIndicesForField(fieldName, resolvedIndices); if (indexInformation.getInferenceIndices().isEmpty()) { // No inference fields were identified, so return the original query. @@ -90,6 +117,37 @@ protected abstract QueryBuilder buildCombinedInferenceAndNonInferenceQuery( InferenceIndexInformationForField indexInformation ); + private List getFieldsFromResolveIndices(ResolvedIndices resolvedIndices) { + Collection indexMetadataCollection = resolvedIndices.getConcreteLocalIndicesMetadata().values(); + List fields = new ArrayList<>(); + for (IndexMetadata indexMetadata : indexMetadataCollection) { + if (indexMetadata.mapping() == null || indexMetadata.mapping().sourceAsMap() == null) { + // No mapping, so no fields. + continue; + } + Collection mappingSource = indexMetadata.mapping().getSourceAsMap().values(); + @SuppressWarnings("unchecked") + Set fieldNames = mappingSource.stream() + .filter(obj -> obj instanceof Map) + .map(obj -> (Map) obj) + .flatMap(map -> map.keySet().stream()) + .collect(Collectors.toSet()); + fields.addAll(fieldNames); + } + return fields; + } + + private List getInferenceFieldsFromResolveIndices(ResolvedIndices resolvedIndices) { + Collection indexMetadataCollection = resolvedIndices.getConcreteLocalIndicesMetadata().values(); + List inferenceIndicesMetadata = new ArrayList<>(); + for (IndexMetadata indexMetadata : indexMetadataCollection) { + String indexName = indexMetadata.getIndex().getName(); + inferenceIndicesMetadata.addAll(indexMetadata.getInferenceFields().values()); + } + + return inferenceIndicesMetadata; + } + private InferenceIndexInformationForField resolveIndicesForField(String fieldName, ResolvedIndices resolvedIndices) { Collection indexMetadataCollection = resolvedIndices.getConcreteLocalIndicesMetadata().values(); Map inferenceIndicesMetadata = new HashMap<>(); From ddd7112529af491960c1452d22310c22b3468bcb Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Fri, 30 May 2025 16:57:38 -0400 Subject: [PATCH 02/13] reformat --- .../SemanticQueryRewriteInterceptor.java | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java index 79085c9bf6c5e..1f1524a213842 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java @@ -44,28 +44,7 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde } if (fieldName == null && getQueryName().equals(MatchAllQueryBuilder.NAME)) { - - if (getInferenceFieldsFromResolveIndices(resolvedIndices).isEmpty()) { - // No inference fields were identified, so return the original query. - return queryBuilder; - } - - List fieldList = new ArrayList<>(getFieldsFromResolveIndices(resolvedIndices)); - BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); - for (String field : fieldList) { - InferenceIndexInformationForField indexInformation = resolveIndicesForField(field, resolvedIndices); - if (indexInformation.nonInferenceIndices().isEmpty() == false) { - // Combined case where the field name requested by this query contains both - // semantic_text and non-inference fields, so we have to combine queries per index - // containing each field type. - boolQueryBuilder.should(buildCombinedInferenceAndNonInferenceQuery(queryBuilder, indexInformation)); - } else { - // The only fields we've identified are inference fields (e.g. semantic_text), - // so rewrite the entire query to work on a semantic_text field. - boolQueryBuilder.should(buildInferenceQuery(queryBuilder, indexInformation)); - } - } - return boolQueryBuilder; + return handleMatchAllQuery(queryBuilder, resolvedIndices); } InferenceIndexInformationForField indexInformation = resolveIndicesForField(fieldName, resolvedIndices); @@ -84,6 +63,30 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde } } + private QueryBuilder handleMatchAllQuery(QueryBuilder queryBuilder, ResolvedIndices resolvedIndices) { + if (getInferenceFieldsFromResolveIndices(resolvedIndices).isEmpty()) { + // No inference fields were identified, so return the original query. + return queryBuilder; + } + + List fieldList = new ArrayList<>(getFieldsFromResolveIndices(resolvedIndices)); + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + for (String field : fieldList) { + InferenceIndexInformationForField indexInformation = resolveIndicesForField(field, resolvedIndices); + if (indexInformation.nonInferenceIndices().isEmpty() == false) { + // Combined case where the field name requested by this query contains both + // semantic_text and non-inference fields, so we have to combine queries per index + // containing each field type. + boolQueryBuilder.should(buildCombinedInferenceAndNonInferenceQuery(queryBuilder, indexInformation)); + } else { + // The only fields we've identified are inference fields (e.g. semantic_text), + // so rewrite this semantic_text field into a semantic query + boolQueryBuilder.should(buildInferenceQuery(queryBuilder, indexInformation)); + } + } + return boolQueryBuilder.should().isEmpty() ? queryBuilder : boolQueryBuilder; + } + /** * @param queryBuilder {@link QueryBuilder} * @return The singular field name requested by the provided query builder. @@ -141,7 +144,6 @@ private List getInferenceFieldsFromResolveIndices(Resolv Collection indexMetadataCollection = resolvedIndices.getConcreteLocalIndicesMetadata().values(); List inferenceIndicesMetadata = new ArrayList<>(); for (IndexMetadata indexMetadata : indexMetadataCollection) { - String indexName = indexMetadata.getIndex().getName(); inferenceIndicesMetadata.addAll(indexMetadata.getInferenceFields().values()); } From d9bcbe36b09cf15a1f4b7fa3d7a638cf306d463b Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Fri, 30 May 2025 21:20:38 +0000 Subject: [PATCH 03/13] [CI] Auto commit changes from spotless --- .../SemanticMatchAllQueryRewriteInterceptor.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java index 7ec4cf193e77c..86f4cf9f8dc76 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java @@ -10,10 +10,9 @@ import org.elasticsearch.features.NodeFeature; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.MatchAllQueryBuilder; -import org.elasticsearch.index.query.MatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; -public class SemanticMatchAllQueryRewriteInterceptor extends SemanticQueryRewriteInterceptor{ +public class SemanticMatchAllQueryRewriteInterceptor extends SemanticQueryRewriteInterceptor { public static final NodeFeature SEMANTIC_MATCH_ALL_QUERY_REWRITE_INTERCEPTION_SUPPORTED = new NodeFeature( "search.semantic_match_all_query_rewrite_interception_supported" @@ -38,17 +37,16 @@ protected QueryBuilder buildInferenceQuery(QueryBuilder queryBuilder, InferenceI } @Override - protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery(QueryBuilder queryBuilder, InferenceIndexInformationForField indexInformation) { + protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery( + QueryBuilder queryBuilder, + InferenceIndexInformationForField indexInformation + ) { assert (queryBuilder instanceof MatchAllQueryBuilder); MatchAllQueryBuilder matchAllQueryBuilder = (MatchAllQueryBuilder) queryBuilder; BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.should( - createSemanticSubQuery( - indexInformation.getInferenceIndices(), - indexInformation.fieldName(), - getQuery(queryBuilder) - ) + createSemanticSubQuery(indexInformation.getInferenceIndices(), indexInformation.fieldName(), getQuery(queryBuilder)) ); boolQueryBuilder.should(createSubQueryForIndices(indexInformation.nonInferenceIndices(), matchAllQueryBuilder)); return boolQueryBuilder; From 60da6f4c793dde3048538c8ad116390136c762df Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Mon, 2 Jun 2025 16:00:54 -0400 Subject: [PATCH 04/13] Excluding matchAllintercepter --- .../inference/queries/SemanticQueryRewriteInterceptor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java index 1f1524a213842..60ceeb4df2415 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java @@ -44,7 +44,8 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde } if (fieldName == null && getQueryName().equals(MatchAllQueryBuilder.NAME)) { - return handleMatchAllQuery(queryBuilder, resolvedIndices); + return queryBuilder; +// return handleMatchAllQuery(queryBuilder, resolvedIndices); } InferenceIndexInformationForField indexInformation = resolveIndicesForField(fieldName, resolvedIndices); From 1139842de253c53ec9652b65e8d66c696aeb79af Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Mon, 2 Jun 2025 16:01:45 -0400 Subject: [PATCH 05/13] Adding matchAllDocs support for vector fields --- .../inference/highlight/SemanticTextHighlighter.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java index ae8997dd8c1f0..4dff2723115ea 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/highlight/SemanticTextHighlighter.java @@ -15,6 +15,7 @@ import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.KnnByteVectorQuery; import org.apache.lucene.search.KnnFloatVectorQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.QueryVisitor; import org.apache.lucene.search.ScoreMode; @@ -267,6 +268,8 @@ public void visitLeaf(Query query) { queries.add(fieldType.createExactKnnQuery(VectorData.fromFloats(knnQuery.getTargetCopy()), null)); } else if (query instanceof KnnByteVectorQuery knnQuery) { queries.add(fieldType.createExactKnnQuery(VectorData.fromBytes(knnQuery.getTargetCopy()), null)); + } else if (query instanceof MatchAllDocsQuery) { + queries.add(new MatchAllDocsQuery()); } } }); @@ -293,6 +296,13 @@ public QueryVisitor getSubVisitor(BooleanClause.Occur occur, Query parent) { } return this; } + + @Override + public void visitLeaf(Query query) { + if (query instanceof MatchAllDocsQuery) { + queries.add(new MatchAllDocsQuery()); + } + } }); return queries; } From 12c15476970fade12dc0cdcc3e332893d04153a6 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Mon, 2 Jun 2025 20:11:55 +0000 Subject: [PATCH 06/13] [CI] Auto commit changes from spotless --- .../inference/queries/SemanticQueryRewriteInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java index 60ceeb4df2415..4ad59ea1c5955 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java @@ -45,7 +45,7 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde if (fieldName == null && getQueryName().equals(MatchAllQueryBuilder.NAME)) { return queryBuilder; -// return handleMatchAllQuery(queryBuilder, resolvedIndices); + // return handleMatchAllQuery(queryBuilder, resolvedIndices); } InferenceIndexInformationForField indexInformation = resolveIndicesForField(fieldName, resolvedIndices); From e788bfba21815b3f38128dbd992f0f2a1e25e3df Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Tue, 3 Jun 2025 00:03:59 -0400 Subject: [PATCH 07/13] Remove previous implementation --- .../xpack/inference/InferencePlugin.java | 2 - ...manticMatchAllQueryRewriteInterceptor.java | 59 ------------------ .../SemanticQueryRewriteInterceptor.java | 61 ------------------- 3 files changed, 122 deletions(-) delete mode 100644 x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java index 53c26c8514375..87256494a60e0 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferencePlugin.java @@ -93,7 +93,6 @@ import org.elasticsearch.xpack.inference.mapper.SemanticInferenceMetadataFieldsMapper; import org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper; import org.elasticsearch.xpack.inference.queries.SemanticKnnVectorQueryRewriteInterceptor; -import org.elasticsearch.xpack.inference.queries.SemanticMatchAllQueryRewriteInterceptor; import org.elasticsearch.xpack.inference.queries.SemanticMatchQueryRewriteInterceptor; import org.elasticsearch.xpack.inference.queries.SemanticQueryBuilder; import org.elasticsearch.xpack.inference.queries.SemanticSparseVectorQueryRewriteInterceptor; @@ -548,7 +547,6 @@ public List getQueryRewriteInterceptors() { return List.of( new SemanticKnnVectorQueryRewriteInterceptor(), new SemanticMatchQueryRewriteInterceptor(), - new SemanticMatchAllQueryRewriteInterceptor(), new SemanticSparseVectorQueryRewriteInterceptor() ); } diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java deleted file mode 100644 index 86f4cf9f8dc76..0000000000000 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticMatchAllQueryRewriteInterceptor.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.inference.queries; - -import org.elasticsearch.features.NodeFeature; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.MatchAllQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; - -public class SemanticMatchAllQueryRewriteInterceptor extends SemanticQueryRewriteInterceptor { - - public static final NodeFeature SEMANTIC_MATCH_ALL_QUERY_REWRITE_INTERCEPTION_SUPPORTED = new NodeFeature( - "search.semantic_match_all_query_rewrite_interception_supported" - ); - - public SemanticMatchAllQueryRewriteInterceptor() {} - - @Override - protected String getFieldName(QueryBuilder queryBuilder) { - assert (queryBuilder instanceof MatchAllQueryBuilder); - return null; // MatchAllQueryBuilder does not have a field name, it matches all documents - } - - @Override - protected String getQuery(QueryBuilder queryBuilder) { - return "*"; // MatchAllQueryBuilder does not have a specific query, it matches all documents - } - - @Override - protected QueryBuilder buildInferenceQuery(QueryBuilder queryBuilder, InferenceIndexInformationForField indexInformation) { - return new SemanticQueryBuilder(indexInformation.fieldName(), getQuery(queryBuilder), false); - } - - @Override - protected QueryBuilder buildCombinedInferenceAndNonInferenceQuery( - QueryBuilder queryBuilder, - InferenceIndexInformationForField indexInformation - ) { - assert (queryBuilder instanceof MatchAllQueryBuilder); - MatchAllQueryBuilder matchAllQueryBuilder = (MatchAllQueryBuilder) queryBuilder; - BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); - - boolQueryBuilder.should( - createSemanticSubQuery(indexInformation.getInferenceIndices(), indexInformation.fieldName(), getQuery(queryBuilder)) - ); - boolQueryBuilder.should(createSubQueryForIndices(indexInformation.nonInferenceIndices(), matchAllQueryBuilder)); - return boolQueryBuilder; - } - - @Override - public String getQueryName() { - return MatchAllQueryBuilder.NAME; - } -} diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java index 4ad59ea1c5955..bb76ef0be24e9 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryRewriteInterceptor.java @@ -12,7 +12,6 @@ import org.elasticsearch.cluster.metadata.InferenceFieldMetadata; import org.elasticsearch.index.mapper.IndexFieldMapper; import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryRewriteContext; import org.elasticsearch.index.query.TermsQueryBuilder; @@ -23,7 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** @@ -43,11 +41,6 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde return queryBuilder; } - if (fieldName == null && getQueryName().equals(MatchAllQueryBuilder.NAME)) { - return queryBuilder; - // return handleMatchAllQuery(queryBuilder, resolvedIndices); - } - InferenceIndexInformationForField indexInformation = resolveIndicesForField(fieldName, resolvedIndices); if (indexInformation.getInferenceIndices().isEmpty()) { // No inference fields were identified, so return the original query. @@ -64,30 +57,6 @@ public QueryBuilder interceptAndRewrite(QueryRewriteContext context, QueryBuilde } } - private QueryBuilder handleMatchAllQuery(QueryBuilder queryBuilder, ResolvedIndices resolvedIndices) { - if (getInferenceFieldsFromResolveIndices(resolvedIndices).isEmpty()) { - // No inference fields were identified, so return the original query. - return queryBuilder; - } - - List fieldList = new ArrayList<>(getFieldsFromResolveIndices(resolvedIndices)); - BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); - for (String field : fieldList) { - InferenceIndexInformationForField indexInformation = resolveIndicesForField(field, resolvedIndices); - if (indexInformation.nonInferenceIndices().isEmpty() == false) { - // Combined case where the field name requested by this query contains both - // semantic_text and non-inference fields, so we have to combine queries per index - // containing each field type. - boolQueryBuilder.should(buildCombinedInferenceAndNonInferenceQuery(queryBuilder, indexInformation)); - } else { - // The only fields we've identified are inference fields (e.g. semantic_text), - // so rewrite this semantic_text field into a semantic query - boolQueryBuilder.should(buildInferenceQuery(queryBuilder, indexInformation)); - } - } - return boolQueryBuilder.should().isEmpty() ? queryBuilder : boolQueryBuilder; - } - /** * @param queryBuilder {@link QueryBuilder} * @return The singular field name requested by the provided query builder. @@ -121,36 +90,6 @@ protected abstract QueryBuilder buildCombinedInferenceAndNonInferenceQuery( InferenceIndexInformationForField indexInformation ); - private List getFieldsFromResolveIndices(ResolvedIndices resolvedIndices) { - Collection indexMetadataCollection = resolvedIndices.getConcreteLocalIndicesMetadata().values(); - List fields = new ArrayList<>(); - for (IndexMetadata indexMetadata : indexMetadataCollection) { - if (indexMetadata.mapping() == null || indexMetadata.mapping().sourceAsMap() == null) { - // No mapping, so no fields. - continue; - } - Collection mappingSource = indexMetadata.mapping().getSourceAsMap().values(); - @SuppressWarnings("unchecked") - Set fieldNames = mappingSource.stream() - .filter(obj -> obj instanceof Map) - .map(obj -> (Map) obj) - .flatMap(map -> map.keySet().stream()) - .collect(Collectors.toSet()); - fields.addAll(fieldNames); - } - return fields; - } - - private List getInferenceFieldsFromResolveIndices(ResolvedIndices resolvedIndices) { - Collection indexMetadataCollection = resolvedIndices.getConcreteLocalIndicesMetadata().values(); - List inferenceIndicesMetadata = new ArrayList<>(); - for (IndexMetadata indexMetadata : indexMetadataCollection) { - inferenceIndicesMetadata.addAll(indexMetadata.getInferenceFields().values()); - } - - return inferenceIndicesMetadata; - } - private InferenceIndexInformationForField resolveIndicesForField(String fieldName, ResolvedIndices resolvedIndices) { Collection indexMetadataCollection = resolvedIndices.getConcreteLocalIndicesMetadata().values(); Map inferenceIndicesMetadata = new HashMap<>(); From 9248b7fe8c0d168a6b883869af66d9c3acf120d1 Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Tue, 3 Jun 2025 00:30:37 -0400 Subject: [PATCH 08/13] Adding yaml tests for match_all --- .../xpack/inference/InferenceFeatures.java | 4 +- .../90_semantic_text_highlighter.yml | 130 +++++++++++++++++ .../90_semantic_text_highlighter_bwc.yml | 131 ++++++++++++++++++ 3 files changed, 264 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java index ae5fc602babb9..669e29ba7debf 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java @@ -34,6 +34,7 @@ public class InferenceFeatures implements FeatureSpecification { private static final NodeFeature TEST_RULE_RETRIEVER_WITH_INDICES_THAT_DONT_RETURN_RANK_DOCS = new NodeFeature( "test_rule_retriever.with_indices_that_dont_return_rank_docs" ); + private static final NodeFeature SEMANTIC_TEXT_MATCH_ALL_HIGHLIGHTER = new NodeFeature("semantic_text.match_all_highlighter"); @Override public Set getTestFeatures() { @@ -57,7 +58,8 @@ public Set getTestFeatures() { SemanticTextFieldMapper.SEMANTIC_TEXT_BIT_VECTOR_SUPPORT, SemanticTextFieldMapper.SEMANTIC_TEXT_HANDLE_EMPTY_INPUT, TEST_RULE_RETRIEVER_WITH_INDICES_THAT_DONT_RETURN_RANK_DOCS, - SEMANTIC_TEXT_SUPPORT_CHUNKING_CONFIG + SEMANTIC_TEXT_SUPPORT_CHUNKING_CONFIG, + SEMANTIC_TEXT_MATCH_ALL_HIGHLIGHTER ); } } diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml index f1a33c262f9d7..98572d1225d3a 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml @@ -336,3 +336,133 @@ setup: - length: { hits.hits.0.highlight.semantic_text_field: 2 } - match: { hits.hits.0.highlight.semantic_text_field.0: "some test data" } - match: { hits.hits.0.highlight.semantic_text_field.1: "now with chunks" } + +--- +"Highlighting with match_all query": + - requires: + cluster_features: "semantic_text.match_all_highlighter" + reason: semantic text field supports match_all query with semantic highlighter, effective from 8.19 and 9.1.0. + + - do: + search: + index: test-sparse-index + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "ElasticSearch is an open source, distributed, RESTful, search engine which is built on top of Lucene internally and enjoys all the features it provides." } + - match: { hits.hits.0.highlight.body.1: "You Know, for Search!" } + + - do: + search: + index: test-dense-index + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "ElasticSearch is an open source, distributed, RESTful, search engine which is built on top of Lucene internally and enjoys all the features it provides." } + - match: { hits.hits.0.highlight.body.1: "You Know, for Search!" } + +--- +"Highlighting with match_all query and multiple field types": + - requires: + cluster_features: "semantic_text.match_all_highlighter" + reason: semantic text field supports match_all query with semantic highlighter, effective from 8.19 and 9.1.0. + + - do: + indices.create: + index: test-index-sparse + body: + settings: + index.mapping.semantic_text.use_legacy_format: false + mappings: + properties: + semantic_text_field: + type: semantic_text + inference_id: sparse-inference-id + text_field: + type: text + + - do: + index: + index: test-index-sparse + id: doc_1 + body: + semantic_text_field: [ "some test data", " ", "now with chunks" ] + text_field: "some test data" + refresh: true + + - do: + search: + index: test-index-sparse + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "some test data" } + - match: { hits.hits.0.highlight.body.1: "now with chunks" } + + - do: + indices.create: + index: test-index-dense + body: + settings: + index.mapping.semantic_text.use_legacy_format: false + mappings: + properties: + semantic_text_field: + type: semantic_text + inference_id: sparse-inference-id + text_field: + type: text + + - do: + index: + index: test-index-dense + id: doc_1 + body: + semantic_text_field: [ "some test data", " ", "now with chunks" ] + text_field: "some test data" + refresh: true + + - do: + search: + index: test-index-dense + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "some test data" } + - match: { hits.hits.0.highlight.body.1: "now with chunks" } diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml index 52fbf4d2723ac..aedf315c20cd6 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml @@ -288,3 +288,134 @@ setup: - length: { hits.hits.0.highlight.semantic_text_field: 2 } - match: { hits.hits.0.highlight.semantic_text_field.0: "some test data" } - match: { hits.hits.0.highlight.semantic_text_field.1: "now with chunks" } + +--- +"Highlighting with match_all query": + - requires: + cluster_features: "semantic_text.match_all_highlighter" + reason: semantic text field supports match_all query with semantic highlighter, effective from 8.19 and 9.1.0. + + - do: + search: + index: test-sparse-index + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "ElasticSearch is an open source, distributed, RESTful, search engine which is built on top of Lucene internally and enjoys all the features it provides." } + - match: { hits.hits.0.highlight.body.1: "You Know, for Search!" } + + - do: + search: + index: test-dense-index + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "ElasticSearch is an open source, distributed, RESTful, search engine which is built on top of Lucene internally and enjoys all the features it provides." } + - match: { hits.hits.0.highlight.body.1: "You Know, for Search!" } + +--- +"Highlighting with match_all query and multiple field types": + - requires: + cluster_features: "semantic_text.match_all_highlighter" + reason: semantic text field supports match_all query with semantic highlighter, effective from 8.19 and 9.1.0. + + - do: + indices.create: + index: test-index-sparse + body: + settings: + index.mapping.semantic_text.use_legacy_format: true + mappings: + properties: + semantic_text_field: + type: semantic_text + inference_id: sparse-inference-id + text_field: + type: text + + - do: + index: + index: test-index-sparse + id: doc_1 + body: + semantic_text_field: [ "some test data", " ", "now with chunks" ] + text_field: "some test data" + refresh: true + + - do: + search: + index: test-index-sparse + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "some test data" } + - match: { hits.hits.0.highlight.body.1: "now with chunks" } + + - do: + indices.create: + index: test-index-dense + body: + settings: + index.mapping.semantic_text.use_legacy_format: true + mappings: + properties: + semantic_text_field: + type: semantic_text + inference_id: sparse-inference-id + text_field: + type: text + + - do: + index: + index: test-index-dense + id: doc_1 + body: + semantic_text_field: [ "some test data", " ", "now with chunks" ] + text_field: "some test data" + refresh: true + + - do: + search: + index: test-index-dense + body: + query: + match_all: {} + highlight: + fields: + body: + type: "semantic" + number_of_fragments: 2 + + - match: { hits.total.value: 1 } + - match: { hits.hits.0._id: "doc_1" } + - length: { hits.hits.0.highlight.body: 2 } + - match: { hits.hits.0.highlight.body.0: "some test data" } + - match: { hits.hits.0.highlight.body.1: "now with chunks" } + From c53cf5bc2c36179af45ddf33bf36e825f18a0639 Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Tue, 3 Jun 2025 09:38:47 -0400 Subject: [PATCH 09/13] fixed yaml tests --- .../90_semantic_text_highlighter.yml | 16 +++++----- .../90_semantic_text_highlighter_bwc.yml | 32 ++++++++++++++----- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml index 98572d1225d3a..8530a21973a3d 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml @@ -416,15 +416,15 @@ setup: match_all: {} highlight: fields: - body: + semantic_text_field: type: "semantic" number_of_fragments: 2 - match: { hits.total.value: 1 } - match: { hits.hits.0._id: "doc_1" } - - length: { hits.hits.0.highlight.body: 2 } - - match: { hits.hits.0.highlight.body.0: "some test data" } - - match: { hits.hits.0.highlight.body.1: "now with chunks" } + - length: { hits.hits.0.highlight.semantic_text_field: 2 } + - match: { hits.hits.0.highlight.semantic_text_field.0: "some test data" } + - match: { hits.hits.0.highlight.semantic_text_field.1: "now with chunks" } - do: indices.create: @@ -457,12 +457,12 @@ setup: match_all: {} highlight: fields: - body: + semantic_text_field: type: "semantic" number_of_fragments: 2 - match: { hits.total.value: 1 } - match: { hits.hits.0._id: "doc_1" } - - length: { hits.hits.0.highlight.body: 2 } - - match: { hits.hits.0.highlight.body.0: "some test data" } - - match: { hits.hits.0.highlight.body.1: "now with chunks" } + - length: { hits.hits.0.highlight.semantic_text_field: 2 } + - match: { hits.hits.0.highlight.semantic_text_field.0: "some test data" } + - match: { hits.hits.0.highlight.semantic_text_field.1: "now with chunks" } diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml index aedf315c20cd6..a4c57bf9d1270 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml @@ -295,6 +295,14 @@ setup: cluster_features: "semantic_text.match_all_highlighter" reason: semantic text field supports match_all query with semantic highlighter, effective from 8.19 and 9.1.0. + - do: + index: + index: test-sparse-index + id: doc_1 + body: + body: [ "ElasticSearch is an open source, distributed, RESTful, search engine which is built on top of Lucene internally and enjoys all the features it provides.", "You Know, for Search!" ] + refresh: true + - do: search: index: test-sparse-index @@ -313,6 +321,14 @@ setup: - match: { hits.hits.0.highlight.body.0: "ElasticSearch is an open source, distributed, RESTful, search engine which is built on top of Lucene internally and enjoys all the features it provides." } - match: { hits.hits.0.highlight.body.1: "You Know, for Search!" } + - do: + index: + index: test-dense-index + id: doc_1 + body: + body: [ "ElasticSearch is an open source, distributed, RESTful, search engine which is built on top of Lucene internally and enjoys all the features it provides.", "You Know, for Search!" ] + refresh: true + - do: search: index: test-dense-index @@ -368,15 +384,15 @@ setup: match_all: {} highlight: fields: - body: + semantic_text_field: type: "semantic" number_of_fragments: 2 - match: { hits.total.value: 1 } - match: { hits.hits.0._id: "doc_1" } - - length: { hits.hits.0.highlight.body: 2 } - - match: { hits.hits.0.highlight.body.0: "some test data" } - - match: { hits.hits.0.highlight.body.1: "now with chunks" } + - length: { hits.hits.0.highlight.semantic_text_field: 2 } + - match: { hits.hits.0.highlight.semantic_text_field.0: "some test data" } + - match: { hits.hits.0.highlight.semantic_text_field.1: "now with chunks" } - do: indices.create: @@ -409,13 +425,13 @@ setup: match_all: {} highlight: fields: - body: + semantic_text_field: type: "semantic" number_of_fragments: 2 - match: { hits.total.value: 1 } - match: { hits.hits.0._id: "doc_1" } - - length: { hits.hits.0.highlight.body: 2 } - - match: { hits.hits.0.highlight.body.0: "some test data" } - - match: { hits.hits.0.highlight.body.1: "now with chunks" } + - length: { hits.hits.0.highlight.semantic_text_field: 2 } + - match: { hits.hits.0.highlight.semantic_text_field.0: "some test data" } + - match: { hits.hits.0.highlight.semantic_text_field.1: "now with chunks" } From b70dc11ec003d397d0e56af431513e89926318f4 Mon Sep 17 00:00:00 2001 From: Samiul Monir <150824886+Samiul-TheSoccerFan@users.noreply.github.com> Date: Tue, 3 Jun 2025 09:43:21 -0400 Subject: [PATCH 10/13] Update docs/changelog/128702.yaml --- docs/changelog/128702.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changelog/128702.yaml diff --git a/docs/changelog/128702.yaml b/docs/changelog/128702.yaml new file mode 100644 index 0000000000000..98a0138a8d2b3 --- /dev/null +++ b/docs/changelog/128702.yaml @@ -0,0 +1,5 @@ +pr: 128702 +summary: Semantic_text `match_all` with Highlighter +area: Relevance +type: bug +issues: [] From 51e21c9c90ed4e40ecb3c830e5159908ae97d3de Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Tue, 3 Jun 2025 09:58:04 -0400 Subject: [PATCH 11/13] Update changelog --- docs/changelog/128702.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog/128702.yaml b/docs/changelog/128702.yaml index 98a0138a8d2b3..09afd50aaa43a 100644 --- a/docs/changelog/128702.yaml +++ b/docs/changelog/128702.yaml @@ -1,5 +1,5 @@ pr: 128702 -summary: Semantic_text `match_all` with Highlighter -area: Relevance +summary: Highlighting support added to semantic_text with `match_all` +area: Search type: bug issues: [] From ed44ca195aaad2458495bdfa1c79b1d210e0ecce Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Tue, 3 Jun 2025 12:16:48 -0400 Subject: [PATCH 12/13] changelog - update summary --- docs/changelog/128702.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/128702.yaml b/docs/changelog/128702.yaml index 09afd50aaa43a..3f74e56627695 100644 --- a/docs/changelog/128702.yaml +++ b/docs/changelog/128702.yaml @@ -1,5 +1,5 @@ pr: 128702 -summary: Highlighting support added to semantic_text with `match_all` +summary: Fix missing highlighting in `match_all` queries for `semantic_text` fields area: Search type: bug issues: [] From 9e42c98dbc4b9c1bd813d6039a76fa10d2480fcd Mon Sep 17 00:00:00 2001 From: Samiul Monir Date: Tue, 3 Jun 2025 13:59:42 -0400 Subject: [PATCH 13/13] Fix wrong inference names for the yaml tests --- .../test/inference/90_semantic_text_highlighter.yml | 4 ++-- .../test/inference/90_semantic_text_highlighter_bwc.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml index 8530a21973a3d..a25a1464a7226 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter.yml @@ -380,7 +380,7 @@ setup: - match: { hits.hits.0.highlight.body.1: "You Know, for Search!" } --- -"Highlighting with match_all query and multiple field types": +"Highlighting with match_all and multi chunks with empty input": - requires: cluster_features: "semantic_text.match_all_highlighter" reason: semantic text field supports match_all query with semantic highlighter, effective from 8.19 and 9.1.0. @@ -436,7 +436,7 @@ setup: properties: semantic_text_field: type: semantic_text - inference_id: sparse-inference-id + inference_id: dense-inference-id text_field: type: text diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml index a4c57bf9d1270..6fcb1bb5a31b3 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/90_semantic_text_highlighter_bwc.yml @@ -348,7 +348,7 @@ setup: - match: { hits.hits.0.highlight.body.1: "You Know, for Search!" } --- -"Highlighting with match_all query and multiple field types": +"Highlighting with match_all and multi chunks with empty input": - requires: cluster_features: "semantic_text.match_all_highlighter" reason: semantic text field supports match_all query with semantic highlighter, effective from 8.19 and 9.1.0. @@ -404,7 +404,7 @@ setup: properties: semantic_text_field: type: semantic_text - inference_id: sparse-inference-id + inference_id: dense-inference-id text_field: type: text