27
27
public class NeuralQueryIT extends BaseNeuralSearchIT {
28
28
private static final String TEST_BASIC_INDEX_NAME = "test-neural-basic-index" ;
29
29
private static final String TEST_MULTI_VECTOR_FIELD_INDEX_NAME = "test-neural-multi-vector-field-index" ;
30
- private static final String TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME = "test-neural-text-and-vector-field-index" ;
31
30
private static final String TEST_NESTED_INDEX_NAME = "test-neural-nested-index" ;
32
31
private static final String TEST_MULTI_DOC_INDEX_NAME = "test-neural-multi-doc-index" ;
33
32
private static final String TEST_QUERY_TEXT = "Hello world" ;
@@ -45,67 +44,40 @@ public void setUp() throws Exception {
45
44
}
46
45
47
46
/**
48
- * Tests basic query:
47
+ * Tests basic query with boost parameter :
49
48
* {
50
49
* "query": {
51
50
* "neural": {
52
51
* "text_knn": {
53
52
* "query_text": "Hello world",
54
53
* "model_id": "dcsdcasd",
55
- * "k": 1
54
+ * "k": 1,
55
+ * "boost": 2.0
56
56
* }
57
57
* }
58
58
* }
59
59
* }
60
- */
61
- @ SneakyThrows
62
- public void testBasicQuery () {
63
- String modelId = null ;
64
- try {
65
- initializeIndexIfNotExist (TEST_BASIC_INDEX_NAME );
66
- modelId = prepareModel ();
67
- NeuralQueryBuilder neuralQueryBuilder = new NeuralQueryBuilder (
68
- TEST_KNN_VECTOR_FIELD_NAME_1 ,
69
- TEST_QUERY_TEXT ,
70
- "" ,
71
- modelId ,
72
- 1 ,
73
- null ,
74
- null
75
- );
76
- Map <String , Object > searchResponseAsMap = search (TEST_BASIC_INDEX_NAME , neuralQueryBuilder , 1 );
77
- Map <String , Object > firstInnerHit = getFirstInnerHit (searchResponseAsMap );
78
-
79
- assertEquals ("1" , firstInnerHit .get ("_id" ));
80
- float expectedScore = computeExpectedScore (modelId , testVector , TEST_SPACE_TYPE , TEST_QUERY_TEXT );
81
- assertEquals (expectedScore , objectToFloat (firstInnerHit .get ("_score" )), DELTA_FOR_SCORE_ASSERTION );
82
- } finally {
83
- wipeOfTestResources (TEST_BASIC_INDEX_NAME , null , modelId , null );
84
- }
85
- }
86
-
87
- /**
88
- * Tests basic query with boost parameter:
60
+ * and query with image query part
89
61
* {
90
62
* "query": {
91
63
* "neural": {
92
64
* "text_knn": {
93
65
* "query_text": "Hello world",
66
+ * "query_image": "base64_1234567890",
94
67
* "model_id": "dcsdcasd",
95
- * "k": 1,
96
- * "boost": 2.0
68
+ * "k": 1
97
69
* }
98
70
* }
99
71
* }
100
72
* }
101
73
*/
102
74
@ SneakyThrows
103
- public void testBoostQuery () {
75
+ public void testQueryWithBoostAndImageQuery () {
104
76
String modelId = null ;
105
77
try {
106
78
initializeIndexIfNotExist (TEST_BASIC_INDEX_NAME );
107
79
modelId = prepareModel ();
108
- NeuralQueryBuilder neuralQueryBuilder = new NeuralQueryBuilder (
80
+ NeuralQueryBuilder neuralQueryBuilderTextQuery = new NeuralQueryBuilder (
109
81
TEST_KNN_VECTOR_FIELD_NAME_1 ,
110
82
TEST_QUERY_TEXT ,
111
83
"" ,
@@ -116,13 +88,33 @@ public void testBoostQuery() {
116
88
);
117
89
118
90
final float boost = 2.0f ;
119
- neuralQueryBuilder .boost (boost );
120
- Map <String , Object > searchResponseAsMap = search (TEST_BASIC_INDEX_NAME , neuralQueryBuilder , 1 );
121
- Map <String , Object > firstInnerHit = getFirstInnerHit (searchResponseAsMap );
91
+ neuralQueryBuilderTextQuery .boost (boost );
92
+ Map <String , Object > searchResponseAsMapTextQuery = search (TEST_BASIC_INDEX_NAME , neuralQueryBuilderTextQuery , 1 );
93
+ Map <String , Object > firstInnerHitTextQuery = getFirstInnerHit (searchResponseAsMapTextQuery );
122
94
123
- assertEquals ("1" , firstInnerHit .get ("_id" ));
95
+ assertEquals ("1" , firstInnerHitTextQuery .get ("_id" ));
124
96
float expectedScore = 2 * computeExpectedScore (modelId , testVector , TEST_SPACE_TYPE , TEST_QUERY_TEXT );
125
- assertEquals (expectedScore , objectToFloat (firstInnerHit .get ("_score" )), DELTA_FOR_SCORE_ASSERTION );
97
+ assertEquals (expectedScore , objectToFloat (firstInnerHitTextQuery .get ("_score" )), DELTA_FOR_SCORE_ASSERTION );
98
+
99
+ NeuralQueryBuilder neuralQueryBuilderMultimodalQuery = new NeuralQueryBuilder (
100
+ TEST_KNN_VECTOR_FIELD_NAME_1 ,
101
+ TEST_QUERY_TEXT ,
102
+ TEST_IMAGE_TEXT ,
103
+ modelId ,
104
+ 1 ,
105
+ null ,
106
+ null
107
+ );
108
+ Map <String , Object > searchResponseAsMapMultimodalQuery = search (TEST_BASIC_INDEX_NAME , neuralQueryBuilderMultimodalQuery , 1 );
109
+ Map <String , Object > firstInnerHitMultimodalQuery = getFirstInnerHit (searchResponseAsMapMultimodalQuery );
110
+
111
+ assertEquals ("1" , firstInnerHitMultimodalQuery .get ("_id" ));
112
+ float expectedScoreMultimodalQuery = computeExpectedScore (modelId , testVector , TEST_SPACE_TYPE , TEST_QUERY_TEXT );
113
+ assertEquals (
114
+ expectedScoreMultimodalQuery ,
115
+ objectToFloat (firstInnerHitMultimodalQuery .get ("_score" )),
116
+ DELTA_FOR_SCORE_ASSERTION
117
+ );
126
118
} finally {
127
119
wipeOfTestResources (TEST_BASIC_INDEX_NAME , null , modelId , null );
128
120
}
@@ -200,15 +192,36 @@ public void testRescoreQuery() {
200
192
* }
201
193
* }
202
194
* }
195
+ * and bool should with BM25 and neural query:
196
+ * {
197
+ * "query": {
198
+ * "bool" : {
199
+ * "should": [
200
+ * "neural": {
201
+ * "field_1": {
202
+ * "query_text": "Hello world",
203
+ * "model_id": "dcsdcasd",
204
+ * "k": 1
205
+ * },
206
+ * },
207
+ * "match": {
208
+ * "field_2": {
209
+ * "query": "Hello world"
210
+ * }
211
+ * }
212
+ * ]
213
+ * }
214
+ * }
215
+ * }
203
216
*/
204
217
@ SneakyThrows
205
218
public void testBooleanQuery_withMultipleNeuralQueries () {
206
219
String modelId = null ;
207
220
try {
208
221
initializeIndexIfNotExist (TEST_MULTI_VECTOR_FIELD_INDEX_NAME );
209
222
modelId = prepareModel ();
210
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder ();
211
-
223
+ // verify two neural queries wrapped into bool
224
+ BoolQueryBuilder boolQueryBuilderTwoNeuralQueries = new BoolQueryBuilder ();
212
225
NeuralQueryBuilder neuralQueryBuilder1 = new NeuralQueryBuilder (
213
226
TEST_KNN_VECTOR_FIELD_NAME_1 ,
214
227
TEST_QUERY_TEXT ,
@@ -228,50 +241,21 @@ public void testBooleanQuery_withMultipleNeuralQueries() {
228
241
null
229
242
);
230
243
231
- boolQueryBuilder .should (neuralQueryBuilder1 ).should (neuralQueryBuilder2 );
244
+ boolQueryBuilderTwoNeuralQueries .should (neuralQueryBuilder1 ).should (neuralQueryBuilder2 );
232
245
233
- Map <String , Object > searchResponseAsMap = search (TEST_MULTI_VECTOR_FIELD_INDEX_NAME , boolQueryBuilder , 1 );
234
- Map <String , Object > firstInnerHit = getFirstInnerHit (searchResponseAsMap );
246
+ Map <String , Object > searchResponseAsMapTwoNeuralQueries = search (
247
+ TEST_MULTI_VECTOR_FIELD_INDEX_NAME ,
248
+ boolQueryBuilderTwoNeuralQueries ,
249
+ 1
250
+ );
251
+ Map <String , Object > firstInnerHitTwoNeuralQueries = getFirstInnerHit (searchResponseAsMapTwoNeuralQueries );
235
252
236
- assertEquals ("1" , firstInnerHit .get ("_id" ));
253
+ assertEquals ("1" , firstInnerHitTwoNeuralQueries .get ("_id" ));
237
254
float expectedScore = 2 * computeExpectedScore (modelId , testVector , TEST_SPACE_TYPE , TEST_QUERY_TEXT );
238
- assertEquals (expectedScore , objectToFloat (firstInnerHit .get ("_score" )), DELTA_FOR_SCORE_ASSERTION );
239
- } finally {
240
- wipeOfTestResources (TEST_MULTI_VECTOR_FIELD_INDEX_NAME , null , modelId , null );
241
- }
242
- }
243
-
244
- /**
245
- * Tests bool should with BM25 and neural query:
246
- * {
247
- * "query": {
248
- * "bool" : {
249
- * "should": [
250
- * "neural": {
251
- * "field_1": {
252
- * "query_text": "Hello world",
253
- * "model_id": "dcsdcasd",
254
- * "k": 1
255
- * },
256
- * },
257
- * "match": {
258
- * "field_2": {
259
- * "query": "Hello world"
260
- * }
261
- * }
262
- * ]
263
- * }
264
- * }
265
- * }
266
- */
267
- @ SneakyThrows
268
- public void testBooleanQuery_withNeuralAndBM25Queries () {
269
- String modelId = null ;
270
- try {
271
- initializeIndexIfNotExist (TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME );
272
- modelId = prepareModel ();
273
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder ();
255
+ assertEquals (expectedScore , objectToFloat (firstInnerHitTwoNeuralQueries .get ("_score" )), DELTA_FOR_SCORE_ASSERTION );
274
256
257
+ // verify bool with one neural and one bm25 query
258
+ BoolQueryBuilder boolQueryBuilderMixOfNeuralAndBM25 = new BoolQueryBuilder ();
275
259
NeuralQueryBuilder neuralQueryBuilder = new NeuralQueryBuilder (
276
260
TEST_KNN_VECTOR_FIELD_NAME_1 ,
277
261
TEST_QUERY_TEXT ,
@@ -284,16 +268,20 @@ public void testBooleanQuery_withNeuralAndBM25Queries() {
284
268
285
269
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder (TEST_TEXT_FIELD_NAME_1 , TEST_QUERY_TEXT );
286
270
287
- boolQueryBuilder .should (neuralQueryBuilder ).should (matchQueryBuilder );
271
+ boolQueryBuilderMixOfNeuralAndBM25 .should (neuralQueryBuilder ).should (matchQueryBuilder );
288
272
289
- Map <String , Object > searchResponseAsMap = search (TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME , boolQueryBuilder , 1 );
290
- Map <String , Object > firstInnerHit = getFirstInnerHit (searchResponseAsMap );
273
+ Map <String , Object > searchResponseAsMapMixOfNeuralAndBM25 = search (
274
+ TEST_MULTI_VECTOR_FIELD_INDEX_NAME ,
275
+ boolQueryBuilderMixOfNeuralAndBM25 ,
276
+ 1
277
+ );
278
+ Map <String , Object > firstInnerHitMixOfNeuralAndBM25 = getFirstInnerHit (searchResponseAsMapMixOfNeuralAndBM25 );
291
279
292
- assertEquals ("1" , firstInnerHit .get ("_id" ));
280
+ assertEquals ("1" , firstInnerHitMixOfNeuralAndBM25 .get ("_id" ));
293
281
float minExpectedScore = computeExpectedScore (modelId , testVector , TEST_SPACE_TYPE , TEST_QUERY_TEXT );
294
- assertTrue (minExpectedScore < objectToFloat (firstInnerHit .get ("_score" )));
282
+ assertTrue (minExpectedScore < objectToFloat (firstInnerHitMixOfNeuralAndBM25 .get ("_score" )));
295
283
} finally {
296
- wipeOfTestResources (TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME , null , modelId , null );
284
+ wipeOfTestResources (TEST_MULTI_VECTOR_FIELD_INDEX_NAME , null , modelId , null );
297
285
}
298
286
}
299
287
@@ -389,47 +377,6 @@ public void testFilterQuery() {
389
377
}
390
378
}
391
379
392
- /**
393
- * Tests basic query for multimodal:
394
- * {
395
- * "query": {
396
- * "neural": {
397
- * "text_knn": {
398
- * "query_text": "Hello world",
399
- * "query_image": "base64_1234567890",
400
- * "model_id": "dcsdcasd",
401
- * "k": 1
402
- * }
403
- * }
404
- * }
405
- * }
406
- */
407
- @ SneakyThrows
408
- public void testMultimodalQuery () {
409
- String modelId = null ;
410
- try {
411
- initializeIndexIfNotExist (TEST_BASIC_INDEX_NAME );
412
- modelId = prepareModel ();
413
- NeuralQueryBuilder neuralQueryBuilder = new NeuralQueryBuilder (
414
- TEST_KNN_VECTOR_FIELD_NAME_1 ,
415
- TEST_QUERY_TEXT ,
416
- TEST_IMAGE_TEXT ,
417
- modelId ,
418
- 1 ,
419
- null ,
420
- null
421
- );
422
- Map <String , Object > searchResponseAsMap = search (TEST_BASIC_INDEX_NAME , neuralQueryBuilder , 1 );
423
- Map <String , Object > firstInnerHit = getFirstInnerHit (searchResponseAsMap );
424
-
425
- assertEquals ("1" , firstInnerHit .get ("_id" ));
426
- float expectedScore = computeExpectedScore (modelId , testVector , TEST_SPACE_TYPE , TEST_QUERY_TEXT );
427
- assertEquals (expectedScore , objectToFloat (firstInnerHit .get ("_score" )), DELTA_FOR_SCORE_ASSERTION );
428
- } finally {
429
- wipeOfTestResources (TEST_BASIC_INDEX_NAME , null , modelId , null );
430
- }
431
- }
432
-
433
380
@ SneakyThrows
434
381
private void initializeIndexIfNotExist (String indexName ) {
435
382
if (TEST_BASIC_INDEX_NAME .equals (indexName ) && !indexExists (TEST_BASIC_INDEX_NAME )) {
@@ -458,7 +405,9 @@ private void initializeIndexIfNotExist(String indexName) {
458
405
TEST_MULTI_VECTOR_FIELD_INDEX_NAME ,
459
406
"1" ,
460
407
List .of (TEST_KNN_VECTOR_FIELD_NAME_1 , TEST_KNN_VECTOR_FIELD_NAME_2 ),
461
- List .of (Floats .asList (testVector ).toArray (), Floats .asList (testVector ).toArray ())
408
+ List .of (Floats .asList (testVector ).toArray (), Floats .asList (testVector ).toArray ()),
409
+ Collections .singletonList (TEST_TEXT_FIELD_NAME_1 ),
410
+ Collections .singletonList (TEST_QUERY_TEXT )
462
411
);
463
412
assertEquals (1 , getDocCount (TEST_MULTI_VECTOR_FIELD_INDEX_NAME ));
464
413
}
@@ -477,22 +426,6 @@ private void initializeIndexIfNotExist(String indexName) {
477
426
assertEquals (1 , getDocCount (TEST_NESTED_INDEX_NAME ));
478
427
}
479
428
480
- if (TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME .equals (indexName ) && !indexExists (TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME )) {
481
- prepareKnnIndex (
482
- TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME ,
483
- Collections .singletonList (new KNNFieldConfig (TEST_KNN_VECTOR_FIELD_NAME_1 , TEST_DIMENSION , TEST_SPACE_TYPE ))
484
- );
485
- addKnnDoc (
486
- TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME ,
487
- "1" ,
488
- Collections .singletonList (TEST_KNN_VECTOR_FIELD_NAME_1 ),
489
- Collections .singletonList (Floats .asList (testVector ).toArray ()),
490
- Collections .singletonList (TEST_TEXT_FIELD_NAME_1 ),
491
- Collections .singletonList (TEST_QUERY_TEXT )
492
- );
493
- assertEquals (1 , getDocCount (TEST_TEXT_AND_VECTOR_FIELD_INDEX_NAME ));
494
- }
495
-
496
429
if (TEST_MULTI_DOC_INDEX_NAME .equals (indexName ) && !indexExists (TEST_MULTI_DOC_INDEX_NAME )) {
497
430
prepareKnnIndex (
498
431
TEST_MULTI_DOC_INDEX_NAME ,
0 commit comments