77
88package org .elasticsearch .xpack .logsdb .patternedtext ;
99
10+ import org .apache .logging .log4j .LogManager ;
11+ import org .apache .logging .log4j .Logger ;
1012import org .elasticsearch .action .DocWriteRequest ;
1113import org .elasticsearch .action .admin .indices .create .CreateIndexRequest ;
1214import org .elasticsearch .action .admin .indices .refresh .RefreshRequest ;
3234
3335import java .io .IOException ;
3436import java .time .Instant ;
35- import java .time .ZoneOffset ;
3637import java .time .ZonedDateTime ;
37- import java .util .*;
38+ import java .util .ArrayList ;
39+ import java .util .Arrays ;
40+ import java .util .Collection ;
41+ import java .util .List ;
42+ import java .util .UUID ;
3843import java .util .concurrent .TimeUnit ;
44+ import java .util .concurrent .atomic .AtomicInteger ;
3945import java .util .stream .Collectors ;
4046
47+ import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertAcked ;
4148import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertNoFailuresAndResponse ;
4249
4350
4451public class PatternedTextRandomTests extends ESIntegTestCase {
52+ private static final Logger logger = LogManager .getLogger (PatternedTextRandomTests .class );
4553
4654 @ Override
4755 protected Settings nodeSettings (int nodeOrdinal , Settings otherSettings ) {
@@ -59,99 +67,83 @@ protected Collection<Class<? extends Plugin>> nodePlugins() {
5967 private static final String INDEX = "test_index" ;
6068 private static final String MATCH_ONLY_TEXT_FIELD = "field_match_only_text" ;
6169 private static final String PATTERNED_TEXT_FIELD = "field_patterned_text" ;
70+ private static final String MAPPING = """
71+ {
72+ "properties": {
73+ "@timestamp": { "type": "date" },
74+ "field_match_only_text": { "type": "match_only_text" },
75+ "field_patterned_text": { "type": "patterned_text" }
76+ }
77+ }
78+ """ ;
6279
6380 @ Before
6481 public void setup () {
6582 assumeTrue ("Only when patterned_text feature flag is enabled" , PatternedTextFieldMapper .PATTERNED_TEXT_MAPPER .isEnabled ());
6683 }
6784
6885 public void testQueries () throws IOException {
69- var settings = Settings .builder ();
70- var mappings = XContentFactory .jsonBuilder ()
71- .startObject ()
72- .startObject ("properties" )
73- .startObject ("@timestamp" )
74- .field ("type" , "date" )
75- .endObject ()
76- .startObject (PATTERNED_TEXT_FIELD )
77- .field ("type" , "patterned_text" )
78- .endObject ()
79- .startObject (MATCH_ONLY_TEXT_FIELD )
80- .field ("type" , "match_only_text" )
81- .endObject ()
82- .endObject ()
83- .endObject ();
84-
8586 var createRequest = new CreateIndexRequest (INDEX )
86- .settings (settings )
87- .mapping (mappings );
87+ .mapping (MAPPING );
8888
89- var createResponse = safeGet (admin ().indices ().create (createRequest ));
90- assertTrue (createResponse .isAcknowledged ());
89+ assertAcked (admin ().indices ().create (createRequest ));
9190
92- int numDocs = randomIntBetween (10 , 1000 );
91+ int numDocs = randomIntBetween (10 , 200 );
9392 List <String > logMessages = generateMessages (numDocs );
9493 indexDocs (logMessages );
9594
96- int [] numQueriesWithResults = { 0 } ;
97- int [] totalQueries = { 0 } ;
95+ var numQueriesWithResults = new AtomicInteger ( 0 ) ;
96+ var numQueriesTotal = new AtomicInteger ( 0 ) ;
9897 for (var message : logMessages ) {
99- List <String > queryTerms = randomQueryParts (message );
100-
98+ List <String > queryTerms = randomQueryValues (message );
10199 var patternedTextQueries = generateQueries (PATTERNED_TEXT_FIELD , queryTerms );
102100 var matchOnlyQueries = generateQueries (MATCH_ONLY_TEXT_FIELD , queryTerms );
103101
104102 for (int i = 0 ; i < patternedTextQueries .size (); ++i ) {
105- var ptQuery = patternedTextQueries .get (i );
106- var motQuery = matchOnlyQueries .get (i );
103+ var ptRequest = client (). prepareSearch ( INDEX ). setQuery ( patternedTextQueries .get (i ) );
104+ var motRequest = client (). prepareSearch ( INDEX ). setQuery ( matchOnlyQueries .get (i ) );
107105
108- var ptRequest = client ().prepareSearch (INDEX ).setQuery (ptQuery ).setSize (numDocs );
109- var motRequest = client ().prepareSearch (INDEX ).setQuery (motQuery ).setSize (numDocs );
110- totalQueries [0 ]++;
106+ numQueriesTotal .incrementAndGet ();
111107 assertNoFailuresAndResponse (ptRequest , ptResponse -> {
112108 assertNoFailuresAndResponse (motRequest , motResponse -> {
109+
113110 assertEquals (motResponse .getHits ().getTotalHits ().value (), ptResponse .getHits ().getTotalHits ().value ());
114111
115- if (motResponse .getHits ().getTotalHits ().value () > 0 ) {
116- numQueriesWithResults [0 ]++;
117- }
118112 var motDocIds = Arrays .stream (motResponse .getHits ().getHits ()).map (SearchHit ::getId ).collect (Collectors .toSet ());
119113 var ptDocIds = Arrays .stream (ptResponse .getHits ().getHits ()).map (SearchHit ::getId ).collect (Collectors .toSet ());
120114 assertEquals (motDocIds , ptDocIds );
115+
116+ if (motResponse .getHits ().getTotalHits ().value () > 0 ) {
117+ numQueriesWithResults .incrementAndGet ();
118+ }
121119 });
122120 });
123121 }
124122 }
125- System . out . println ( "num queries with results: " + numQueriesWithResults [ 0 ] + ", total: " + totalQueries [ 0 ] );
123+ logger . info ( "Ran {} queries, of which {} had matches " , numQueriesTotal . get (), numQueriesWithResults . get () );
126124 }
127125
128- public List <QueryBuilder > generateQueries (String field , List <String > queryTerms ) {
126+ private List <QueryBuilder > generateQueries (String field , List <String > queryTerms ) {
129127 var results = new ArrayList <QueryBuilder >();
130-
131128 for (var queryTerm : queryTerms ) {
132129 results .add (QueryBuilders .termQuery (field , queryTerm ));
133130 results .add (QueryBuilders .matchQuery (field , queryTerm ));
134131 results .add (QueryBuilders .matchPhraseQuery (field , queryTerm ));
135132 }
136-
137133 return results ;
138134 }
139135
140- private static List <String > randomQueryParts (String value ) {
136+ private static List <String > randomQueryValues (String value ) {
141137 var values = new ArrayList <String >();
142- var tokenizerRegex = "[\\ s\\ p{Punct}]+" ;
143- List <String > tokens = Arrays .stream (value .split (tokenizerRegex )).filter (t -> t .isEmpty () == false ).toList ();
144138
145- // full value
146139 values .add (value );
147- // random sub-phrase
148140 values .add (randomSubstring (value ));
149141
142+ var tokenizerRegex = "[\\ s\\ p{Punct}]+" ;
143+ List <String > tokens = Arrays .stream (value .split (tokenizerRegex )).filter (t -> t .isEmpty () == false ).toList ();
150144 if (tokens .isEmpty () == false ) {
151- // random term
152145 values .add (randomFrom (tokens ));
153- // random sub-phrase
154- values .add (getSubPhrase (tokens ));
146+ values .add (randomSubPhrase (tokens ));
155147 }
156148 return values ;
157149 }
@@ -162,7 +154,7 @@ private static String randomSubstring(String value) {
162154 return value .substring (low , hi );
163155 }
164156
165- private static String getSubPhrase (List <String > tokens ) {
157+ private static String randomSubPhrase (List <String > tokens ) {
166158 int low = ESTestCase .randomIntBetween (0 , tokens .size () - 1 );
167159 int hi = ESTestCase .randomIntBetween (low + 1 , tokens .size ());
168160 return String .join (" " , tokens .subList (low , hi ));
0 commit comments