|
26 | 26 | import org.elasticsearch.search.SearchHit; |
27 | 27 | import org.elasticsearch.test.ESIntegTestCase; |
28 | 28 | import org.elasticsearch.test.ESTestCase; |
29 | | -import org.elasticsearch.xcontent.XContentFactory; |
30 | 29 | import org.elasticsearch.xcontent.json.JsonXContent; |
31 | 30 | import org.elasticsearch.xpack.core.LocalStateCompositeXPackPlugin; |
32 | 31 | import org.elasticsearch.xpack.logsdb.LogsDBPlugin; |
|
42 | 41 | import java.util.UUID; |
43 | 42 | import java.util.concurrent.TimeUnit; |
44 | 43 | import java.util.concurrent.atomic.AtomicInteger; |
| 44 | +import java.util.function.BiFunction; |
45 | 45 | import java.util.stream.Collectors; |
46 | 46 |
|
47 | 47 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; |
48 | 48 | import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailuresAndResponse; |
49 | 49 |
|
50 | 50 |
|
51 | | -public class PatternedTextRandomTests extends ESIntegTestCase { |
52 | | - private static final Logger logger = LogManager.getLogger(PatternedTextRandomTests.class); |
| 51 | +public class PatternedTextVsMatchOnlyTextTests extends ESIntegTestCase { |
| 52 | + private static final Logger logger = LogManager.getLogger(PatternedTextVsMatchOnlyTextTests.class); |
53 | 53 |
|
54 | 54 | @Override |
55 | 55 | protected Settings nodeSettings(int nodeOrdinal, Settings otherSettings) { |
@@ -92,45 +92,52 @@ public void testQueries() throws IOException { |
92 | 92 | List<String> logMessages = generateMessages(numDocs); |
93 | 93 | indexDocs(logMessages); |
94 | 94 |
|
| 95 | + var queryTerms = logMessages.stream().flatMap(m -> randomQueryValues(m).stream()).toList(); |
| 96 | + { |
| 97 | + var ptQueries = buildQueries(PATTERNED_TEXT_FIELD, queryTerms, QueryBuilders::matchPhraseQuery); |
| 98 | + var motQueries = buildQueries(MATCH_ONLY_TEXT_FIELD, queryTerms, QueryBuilders::matchPhraseQuery); |
| 99 | + assertQueryResults(ptQueries, motQueries, numDocs, "phrase"); |
| 100 | + } |
| 101 | + { |
| 102 | + var ptQueries = buildQueries(PATTERNED_TEXT_FIELD, queryTerms, QueryBuilders::matchQuery); |
| 103 | + var motQueries = buildQueries(MATCH_ONLY_TEXT_FIELD, queryTerms, QueryBuilders::matchQuery); |
| 104 | + assertQueryResults(ptQueries, motQueries, numDocs, "match"); |
| 105 | + } |
| 106 | + { |
| 107 | + var ptQueries = buildQueries(PATTERNED_TEXT_FIELD, queryTerms, QueryBuilders::termQuery); |
| 108 | + var motQueries = buildQueries(MATCH_ONLY_TEXT_FIELD, queryTerms, QueryBuilders::termQuery); |
| 109 | + assertQueryResults(ptQueries, motQueries, numDocs, "term"); |
| 110 | + } |
| 111 | + } |
| 112 | + |
| 113 | + private void assertQueryResults(List<QueryBuilder> patternedTextQueries, List<QueryBuilder> matchOnlyTextQueries, int numDocs, String queryType) { |
95 | 114 | var numQueriesWithResults = new AtomicInteger(0); |
96 | 115 | var numQueriesTotal = new AtomicInteger(0); |
97 | | - for (var message : logMessages) { |
98 | | - List<String> queryTerms = randomQueryValues(message); |
99 | | - var patternedTextQueries = generateQueries(PATTERNED_TEXT_FIELD, queryTerms); |
100 | | - var matchOnlyQueries = generateQueries(MATCH_ONLY_TEXT_FIELD, queryTerms); |
101 | | - |
102 | | - for (int i = 0; i < patternedTextQueries.size(); ++i) { |
103 | | - var ptRequest = client().prepareSearch(INDEX).setQuery(patternedTextQueries.get(i)); |
104 | | - var motRequest = client().prepareSearch(INDEX).setQuery(matchOnlyQueries.get(i)); |
| 116 | + for (int i = 0; i < patternedTextQueries.size(); ++i) { |
| 117 | + var ptRequest = client().prepareSearch(INDEX).setQuery(patternedTextQueries.get(i)).setSize(numDocs); |
| 118 | + var motRequest = client().prepareSearch(INDEX).setQuery(matchOnlyTextQueries.get(i)).setSize(numDocs); |
105 | 119 |
|
106 | | - numQueriesTotal.incrementAndGet(); |
107 | | - assertNoFailuresAndResponse(ptRequest, ptResponse -> { |
108 | | - assertNoFailuresAndResponse(motRequest, motResponse -> { |
| 120 | + numQueriesTotal.incrementAndGet(); |
| 121 | + assertNoFailuresAndResponse(ptRequest, ptResponse -> { |
| 122 | + assertNoFailuresAndResponse(motRequest, motResponse -> { |
109 | 123 |
|
110 | | - assertEquals(motResponse.getHits().getTotalHits().value(), ptResponse.getHits().getTotalHits().value()); |
| 124 | + assertEquals(motResponse.getHits().getTotalHits().value(), ptResponse.getHits().getTotalHits().value()); |
111 | 125 |
|
112 | | - var motDocIds = Arrays.stream(motResponse.getHits().getHits()).map(SearchHit::getId).collect(Collectors.toSet()); |
113 | | - var ptDocIds = Arrays.stream(ptResponse.getHits().getHits()).map(SearchHit::getId).collect(Collectors.toSet()); |
114 | | - assertEquals(motDocIds, ptDocIds); |
| 126 | + var motDocIds = Arrays.stream(motResponse.getHits().getHits()).map(SearchHit::getId).collect(Collectors.toSet()); |
| 127 | + var ptDocIds = Arrays.stream(ptResponse.getHits().getHits()).map(SearchHit::getId).collect(Collectors.toSet()); |
| 128 | + assertEquals(motDocIds, ptDocIds); |
115 | 129 |
|
116 | | - if (motResponse.getHits().getTotalHits().value() > 0) { |
117 | | - numQueriesWithResults.incrementAndGet(); |
118 | | - } |
119 | | - }); |
| 130 | + if (motResponse.getHits().getTotalHits().value() > 0) { |
| 131 | + numQueriesWithResults.incrementAndGet(); |
| 132 | + } |
120 | 133 | }); |
121 | | - } |
| 134 | + }); |
122 | 135 | } |
123 | | - logger.info("Ran {} queries, of which {} had matches", numQueriesTotal.get(), numQueriesWithResults.get()); |
| 136 | + logger.info("Ran {} {} queries, of which {} had matches", numQueriesTotal.get(), queryType, numQueriesWithResults.get()); |
124 | 137 | } |
125 | 138 |
|
126 | | - private List<QueryBuilder> generateQueries(String field, List<String> queryTerms) { |
127 | | - var results = new ArrayList<QueryBuilder>(); |
128 | | - for (var queryTerm : queryTerms) { |
129 | | - results.add(QueryBuilders.termQuery(field, queryTerm)); |
130 | | - results.add(QueryBuilders.matchQuery(field, queryTerm)); |
131 | | - results.add(QueryBuilders.matchPhraseQuery(field, queryTerm)); |
132 | | - } |
133 | | - return results; |
| 139 | + private List<QueryBuilder> buildQueries(String field, List<String> terms, BiFunction<String, Object, QueryBuilder> queryBuilder) { |
| 140 | + return terms.stream().map(t -> queryBuilder.apply(field, t)).toList(); |
134 | 141 | } |
135 | 142 |
|
136 | 143 | private static List<String> randomQueryValues(String value) { |
@@ -211,7 +218,7 @@ public static String randomMessage() { |
211 | 218 | () -> randomRealisticUnicodeOfCodepointLength(randomIntBetween(1, 20)), |
212 | 219 | () -> UUID.randomUUID().toString(), |
213 | 220 | () -> randomIp(randomBoolean()), |
214 | | - PatternedTextRandomTests::randomTimestamp, |
| 221 | + PatternedTextVsMatchOnlyTextTests::randomTimestamp, |
215 | 222 | ESTestCase::randomInt, |
216 | 223 | ESTestCase::randomDouble |
217 | 224 | ); |
|
0 commit comments