40
40
import java .io .IOException ;
41
41
import java .util .Arrays ;
42
42
import java .util .Collections ;
43
+ import java .util .HashMap ;
43
44
import java .util .HashSet ;
44
45
import java .util .List ;
46
+ import java .util .Map ;
45
47
import java .util .Set ;
46
48
47
49
import static org .hamcrest .Matchers .containsInAnyOrder ;
@@ -233,16 +235,22 @@ public void testMinTTF() throws IOException {
233
235
Document d = new Document ();
234
236
d .add (new TextField ("id" , Integer .toString (i ), Field .Store .YES ));
235
237
d .add (new Field ("dense" , "foo foo foo" , ft ));
236
- if (i % 10 == 0 ) {
238
+ if (i % 2 == 0 ) {
237
239
d .add (new Field ("sparse" , "foo" , ft ));
238
240
}
241
+ if (i % 10 == 0 ) {
242
+ d .add (new Field ("more_sparse" , "foo" , ft ));
243
+ }
239
244
w .addDocument (d );
240
245
}
246
+
241
247
w .commit ();
248
+ w .forceMerge (1 );
249
+
242
250
DirectoryReader reader = DirectoryReader .open (w );
243
251
IndexSearcher searcher = setSimilarity (newSearcher (reader ));
244
252
{
245
- String [] fields = new String [] { "dense" , "sparse" };
253
+ String [] fields = new String [] { "dense" , "sparse" , "more_sparse" };
246
254
Query query = BlendedTermQuery .dismaxBlendedQuery (toTerms (fields , "foo" ), 0.1f );
247
255
TopDocs search = searcher .search (query , 10 );
248
256
ScoreDoc [] scoreDocs = search .scoreDocs ;
@@ -253,6 +261,55 @@ public void testMinTTF() throws IOException {
253
261
dir .close ();
254
262
}
255
263
264
+ public void testRandomFields () throws IOException {
265
+ Directory dir = newDirectory ();
266
+ IndexWriter w = new IndexWriter (dir , newIndexWriterConfig (new MockAnalyzer (random ())));
267
+ FieldType ft = new FieldType (TextField .TYPE_NOT_STORED );
268
+ ft .freeze ();
269
+
270
+ Map <String , Float > fields = new HashMap <>();
271
+ fields .put ("field" , 1.0f );
272
+
273
+ int numRandomFields = random ().nextInt (7 );
274
+ for (int i = 0 ; i < numRandomFields ; i ++) {
275
+ String field = "field" + i ;
276
+ float probability = randomBoolean () ? 1.0f : randomFloat ();
277
+ fields .put (field , probability );
278
+ }
279
+
280
+ int numDocs = atLeast (100 );
281
+ for (int i = 0 ; i < numDocs ; i ++) {
282
+ Document d = new Document ();
283
+ for (Map .Entry <String , Float > entry : fields .entrySet ()) {
284
+ String field = entry .getKey ();
285
+ float probability = entry .getValue ();
286
+ if (randomFloat () < probability ) {
287
+ String value = randomBoolean () ? "foo" : "foo foo foo" ;
288
+ d .add (new Field (field , value , ft ));
289
+ }
290
+ if (randomFloat () < probability ) {
291
+ d .add (new Field (field , "bar bar" , ft ));
292
+ }
293
+ }
294
+ w .addDocument (d );
295
+ }
296
+
297
+ w .commit ();
298
+
299
+ DirectoryReader reader = DirectoryReader .open (w );
300
+ IndexSearcher searcher = setSimilarity (newSearcher (reader ));
301
+ {
302
+ String [] fieldNames = fields .keySet ().toArray (new String [0 ]);
303
+ Query query = BlendedTermQuery .dismaxBlendedQuery (toTerms (fieldNames , "foo" ), 0.1f );
304
+ TopDocs search = searcher .search (query , 10 );
305
+ assertTrue (search .totalHits .value > 0 );
306
+ assertTrue (search .scoreDocs .length > 0 );
307
+ }
308
+ reader .close ();
309
+ w .close ();
310
+ dir .close ();
311
+ }
312
+
256
313
public void testMissingFields () throws IOException {
257
314
Directory dir = newDirectory ();
258
315
IndexWriter w = new IndexWriter (dir , newIndexWriterConfig (new MockAnalyzer (random ())));
0 commit comments