|
12 | 12 | import org.elasticsearch.common.settings.Settings;
|
13 | 13 | import org.elasticsearch.common.time.DateFormatter;
|
14 | 14 | import org.elasticsearch.common.time.FormatNames;
|
| 15 | +import org.elasticsearch.common.xcontent.support.XContentMapValues; |
15 | 16 | import org.elasticsearch.index.IndexSettings;
|
16 | 17 | import org.elasticsearch.test.cluster.ElasticsearchCluster;
|
17 | 18 | import org.elasticsearch.test.cluster.local.distribution.DistributionType;
|
@@ -340,4 +341,115 @@ public void testLogsdbDefaultWithRecoveryUseSyntheticSource() throws IOException
|
340 | 341 | assertNull(settings.get("index.mapping.source.mode"));
|
341 | 342 | assertEquals("true", settings.get(IndexSettings.LOGSDB_SORT_ON_HOST_NAME.getKey()));
|
342 | 343 | }
|
| 344 | + |
| 345 | + public void testSyntheticSourceRuntimeFieldQueries() throws IOException { |
| 346 | + String mappings = """ |
| 347 | + { |
| 348 | + "runtime": { |
| 349 | + "message_length": { |
| 350 | + "type": "long" |
| 351 | + } |
| 352 | + }, |
| 353 | + "dynamic": false, |
| 354 | + "properties": { |
| 355 | + "@timestamp": { |
| 356 | + "type": "date" |
| 357 | + }, |
| 358 | + "log" : { |
| 359 | + "properties": { |
| 360 | + "level": { |
| 361 | + "type": "keyword" |
| 362 | + } |
| 363 | + } |
| 364 | + } |
| 365 | + } |
| 366 | + } |
| 367 | + """; |
| 368 | + String indexName = "test-foo"; |
| 369 | + createIndex(indexName, Settings.builder().put("index.mode", "logsdb").build(), mappings); |
| 370 | + |
| 371 | + int numDocs = 1000; |
| 372 | + var sb = new StringBuilder(); |
| 373 | + var now = Instant.now(); |
| 374 | + for (int i = 0; i < numDocs; i++) { |
| 375 | + String level = randomBoolean() ? "info" : randomBoolean() ? "warning" : randomBoolean() ? "error" : "fatal"; |
| 376 | + String msg = randomAlphaOfLength(20); |
| 377 | + String messageLength = Integer.toString(msg.length()); |
| 378 | + sb.append("{ \"create\": {} }").append('\n'); |
| 379 | + if (randomBoolean()) { |
| 380 | + sb.append(""" |
| 381 | + {"@timestamp":"$now","message":"$msg","message_length":$l,"log":{"level":"$level"}} |
| 382 | + """.replace("$now", formatInstant(now)).replace("$level", level).replace("$msg", msg).replace("$l", messageLength)); |
| 383 | + } else { |
| 384 | + sb.append(""" |
| 385 | + {"@timestamp": "$now", "message": "$msg", "message_length": $l} |
| 386 | + """.replace("$now", formatInstant(now)).replace("$msg", msg).replace("$l", messageLength)); |
| 387 | + } |
| 388 | + sb.append('\n'); |
| 389 | + if (i != numDocs - 1) { |
| 390 | + now = now.plusSeconds(1); |
| 391 | + } |
| 392 | + } |
| 393 | + |
| 394 | + var bulkRequest = new Request("POST", "/" + indexName + "/_bulk"); |
| 395 | + bulkRequest.setJsonEntity(sb.toString()); |
| 396 | + bulkRequest.addParameter("refresh", "true"); |
| 397 | + var bulkResponse = client().performRequest(bulkRequest); |
| 398 | + var bulkResponseBody = responseAsMap(bulkResponse); |
| 399 | + assertThat(bulkResponseBody, Matchers.hasEntry("errors", false)); |
| 400 | + |
| 401 | + var forceMergeRequest = new Request("POST", "/" + indexName + "/_forcemerge"); |
| 402 | + var forceMergeResponse = client().performRequest(forceMergeRequest); |
| 403 | + assertOK(forceMergeResponse); |
| 404 | + |
| 405 | + var searchRequest = new Request("POST", "/" + indexName + "/_search"); |
| 406 | + |
| 407 | + searchRequest.setJsonEntity(""" |
| 408 | + { |
| 409 | + "size": 1, |
| 410 | + "query": { |
| 411 | + "bool": { |
| 412 | + "should": [ |
| 413 | + { |
| 414 | + "range": { |
| 415 | + "message_length": { |
| 416 | + "gte": 1, |
| 417 | + "lt": 900000 |
| 418 | + } |
| 419 | + } |
| 420 | + }, |
| 421 | + { |
| 422 | + "range": { |
| 423 | + "message_length": { |
| 424 | + "gte": 900000, |
| 425 | + "lt": 1000000 |
| 426 | + } |
| 427 | + } |
| 428 | + } |
| 429 | + ], |
| 430 | + "minimum_should_match": "1", |
| 431 | + "must_not": [ |
| 432 | + { |
| 433 | + "range": { |
| 434 | + "message_length": { |
| 435 | + "lt": 0 |
| 436 | + } |
| 437 | + } |
| 438 | + } |
| 439 | + ] |
| 440 | + } |
| 441 | + } |
| 442 | + } |
| 443 | + """); |
| 444 | + var searchResponse = client().performRequest(searchRequest); |
| 445 | + assertOK(searchResponse); |
| 446 | + var searchResponseBody = responseAsMap(searchResponse); |
| 447 | + int totalHits = (int) XContentMapValues.extractValue("hits.total.value", searchResponseBody); |
| 448 | + assertThat(totalHits, equalTo(numDocs)); |
| 449 | + |
| 450 | + var shardsHeader = (Map<?, ?>) searchResponseBody.get("_shards"); |
| 451 | + assertThat(shardsHeader.get("failed"), equalTo(0)); |
| 452 | + assertThat(shardsHeader.get("successful"), equalTo(1)); |
| 453 | + assertThat(shardsHeader.get("skipped"), equalTo(0)); |
| 454 | + } |
343 | 455 | }
|
0 commit comments