Skip to content

Commit 0550dae

Browse files
Merge branch 'main' into lookupPrefilterPushable
2 parents 166130f + 3bcf194 commit 0550dae

File tree

7 files changed

+352
-104
lines changed

7 files changed

+352
-104
lines changed

docs/changelog/133675.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 133675
2+
summary: Support using the semantic query across multiple inference IDs
3+
area: Vector Search
4+
type: enhancement
5+
issues: []

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,8 @@ static TransportVersion def(int id) {
356356
public static final TransportVersion PROJECT_RESERVED_STATE_MOVE_TO_REGISTRY = def(9_147_0_00);
357357
public static final TransportVersion STREAMS_ENDPOINT_PARAM_RESTRICTIONS = def(9_148_0_00);
358358
public static final TransportVersion RESOLVE_INDEX_MODE_FILTER = def(9_149_0_00);
359-
public static final TransportVersion ESQL_LOOKUP_JOIN_PRE_JOIN_FILTER = def(9_150_0_00);
359+
public static final TransportVersion SEMANTIC_QUERY_MULTIPLE_INFERENCE_IDS = def(9_150_0_00);
360+
public static final TransportVersion ESQL_LOOKUP_JOIN_PRE_JOIN_FILTER = def(9_151_0_00);
360361

361362
/*
362363
* STOP! READ THIS FIRST! No, really,

x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/SemanticMatchTestCase.java

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,28 @@ public abstract class SemanticMatchTestCase extends ESRestTestCase {
3434
public void testWithMultipleInferenceIds() throws IOException {
3535
assumeTrue("semantic text capability not available", EsqlCapabilities.Cap.SEMANTIC_TEXT_FIELD_CAPS.isEnabled());
3636

37+
var request1 = new Request("POST", "/test-semantic1/_doc/id-1");
38+
request1.addParameter("refresh", "true");
39+
request1.setJsonEntity("{\"semantic_text_field\": \"inference test 1\"}");
40+
assertEquals(201, adminClient().performRequest(request1).getStatusLine().getStatusCode());
41+
42+
var request2 = new Request("POST", "/test-semantic2/_doc/id-2");
43+
request2.addParameter("refresh", "true");
44+
request2.setJsonEntity("{\"semantic_text_field\": \"inference test 2\"}");
45+
assertEquals(201, adminClient().performRequest(request2).getStatusLine().getStatusCode());
46+
3747
String query = """
3848
from test-semantic1,test-semantic2
3949
| where match(semantic_text_field, "something")
50+
| SORT semantic_text_field ASC
4051
""";
41-
ResponseException re = expectThrows(ResponseException.class, () -> runEsqlQuery(query));
42-
43-
assertThat(re.getMessage(), containsString("Field [semantic_text_field] has multiple inference IDs associated with it"));
52+
Map<String, Object> result = runEsqlQuery(query);
4453

45-
assertEquals(400, re.getResponse().getStatusLine().getStatusCode());
54+
assertResultMap(
55+
result,
56+
matchesList().item(matchesMap().entry("name", "semantic_text_field").entry("type", "text")),
57+
matchesList(List.of(List.of("inference test 1"), List.of("inference test 2")))
58+
);
4659
}
4760

4861
public void testWithInferenceNotConfigured() {
@@ -128,6 +141,28 @@ public void setUpIndices() throws IOException {
128141
createIndex(adminClient(), "test-semantic4", settings, mapping4);
129142
}
130143

144+
@Before
145+
public void setUpSparseEmbeddingInferenceEndpoint() throws IOException {
146+
Request request = new Request("PUT", "_inference/sparse_embedding/test_sparse_inference");
147+
request.setJsonEntity("""
148+
{
149+
"service": "test_service",
150+
"service_settings": {
151+
"model": "my_model",
152+
"api_key": "abc64"
153+
},
154+
"task_settings": {
155+
}
156+
}
157+
""");
158+
try {
159+
adminClient().performRequest(request);
160+
} catch (ResponseException exc) {
161+
// in case the removal failed
162+
assertThat(exc.getResponse().getStatusLine().getStatusCode(), equalTo(400));
163+
}
164+
}
165+
131166
@Before
132167
public void setUpTextEmbeddingInferenceEndpoint() throws IOException {
133168
Request request = new Request("PUT", "_inference/text_embedding/test_dense_inference");
@@ -155,6 +190,15 @@ public void setUpTextEmbeddingInferenceEndpoint() throws IOException {
155190
public void wipeData() throws IOException {
156191
adminClient().performRequest(new Request("DELETE", "*"));
157192

193+
try {
194+
adminClient().performRequest(new Request("DELETE", "_inference/test_sparse_inference"));
195+
} catch (ResponseException e) {
196+
// 404 here means the endpoint was not created
197+
if (e.getResponse().getStatusLine().getStatusCode() != 404) {
198+
throw e;
199+
}
200+
}
201+
158202
try {
159203
adminClient().performRequest(new Request("DELETE", "_inference/test_dense_inference"));
160204
} catch (ResponseException e) {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.elasticsearch.features.NodeFeature;
1212
import org.elasticsearch.xpack.inference.mapper.SemanticInferenceMetadataFieldsMapper;
1313
import org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper;
14+
import org.elasticsearch.xpack.inference.queries.SemanticQueryBuilder;
1415
import org.elasticsearch.xpack.inference.rank.textsimilarity.TextSimilarityRankRetrieverBuilder;
1516

1617
import java.util.HashSet;
@@ -82,7 +83,8 @@ public Set<NodeFeature> getTestFeatures() {
8283
SEMANTIC_QUERY_REWRITE_INTERCEPTORS_PROPAGATE_BOOST_AND_QUERY_NAME_FIX,
8384
SEMANTIC_TEXT_HIGHLIGHTING_FLAT,
8485
SEMANTIC_TEXT_SPARSE_VECTOR_INDEX_OPTIONS,
85-
SEMANTIC_TEXT_FIELDS_CHUNKS_FORMAT
86+
SEMANTIC_TEXT_FIELDS_CHUNKS_FORMAT,
87+
SemanticQueryBuilder.SEMANTIC_QUERY_MULTIPLE_INFERENCE_IDS
8688
)
8789
);
8890
if (RERANK_SNIPPETS.isEnabled()) {

0 commit comments

Comments
 (0)