1
package org.apache.lucene.search.vectorhighlight;
3
* Licensed to the Apache Software Foundation (ASF) under one or more
4
* contributor license agreements. See the NOTICE file distributed with
5
* this work for additional information regarding copyright ownership.
6
* The ASF licenses this file to You under the Apache License, Version 2.0
7
* (the "License"); you may not use this file except in compliance with
8
* the License. You may obtain a copy of the License at
10
* http://www.apache.org/licenses/LICENSE-2.0
12
* Unless required by applicable law or agreed to in writing, software
13
* distributed under the License is distributed on an "AS IS" BASIS,
14
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
* See the License for the specific language governing permissions and
16
* limitations under the License.
19
import java.io.IOException;
20
import java.util.ArrayList;
21
import java.util.HashSet;
22
import java.util.List;
26
import org.apache.lucene.index.Term;
27
import org.apache.lucene.search.BooleanQuery;
28
import org.apache.lucene.search.PrefixQuery;
29
import org.apache.lucene.search.Query;
30
import org.apache.lucene.search.BooleanClause.Occur;
31
import org.apache.lucene.search.TermQuery;
32
import org.apache.lucene.search.TermRangeQuery;
33
import org.apache.lucene.search.WildcardQuery;
34
import org.apache.lucene.search.regex.RegexQuery;
35
import org.apache.lucene.search.vectorhighlight.FieldQuery.QueryPhraseMap;
36
import org.apache.lucene.search.vectorhighlight.FieldTermStack.TermInfo;
38
public class FieldQueryTest extends AbstractTestCase {
40
public void testFlattenBoolean() throws Exception {
41
Query query = paW.parse( "A AND B OR C NOT (D AND E)" );
42
FieldQuery fq = new FieldQuery( query, true, true );
43
Set<Query> flatQueries = new HashSet<Query>();
44
fq.flatten( query, reader, flatQueries );
45
assertCollectionQueries( flatQueries, tq( "A" ), tq( "B" ), tq( "C" ) );
48
public void testFlattenDisjunctionMaxQuery() throws Exception {
49
Query query = dmq( tq( "A" ), tq( "B" ), pqF( "C", "D" ) );
50
FieldQuery fq = new FieldQuery( query, true, true );
51
Set<Query> flatQueries = new HashSet<Query>();
52
fq.flatten( query, reader, flatQueries );
53
assertCollectionQueries( flatQueries, tq( "A" ), tq( "B" ), pqF( "C", "D" ) );
56
public void testFlattenTermAndPhrase() throws Exception {
57
Query query = paW.parse( "A AND \"B C\"" );
58
FieldQuery fq = new FieldQuery( query, true, true );
59
Set<Query> flatQueries = new HashSet<Query>();
60
fq.flatten( query, reader, flatQueries );
61
assertCollectionQueries( flatQueries, tq( "A" ), pqF( "B", "C" ) );
64
public void testFlattenTermAndPhrase2gram() throws Exception {
65
Query query = paB.parse( "AA AND \"BCD\" OR \"EFGH\"" );
66
FieldQuery fq = new FieldQuery( query, true, true );
67
Set<Query> flatQueries = new HashSet<Query>();
68
fq.flatten( query, reader, flatQueries );
69
assertCollectionQueries( flatQueries, tq( "AA" ), pqF( "BC", "CD" ), pqF( "EF", "FG", "GH" ) );
72
public void testFlatten1TermPhrase() throws Exception {
73
Query query = pqF( "A" );
74
FieldQuery fq = new FieldQuery( query, true, true );
75
Set<Query> flatQueries = new HashSet<Query>();
76
fq.flatten( query, reader, flatQueries );
77
assertCollectionQueries( flatQueries, tq( "A" ) );
80
public void testExpand() throws Exception {
81
Query dummy = pqF( "DUMMY" );
82
FieldQuery fq = new FieldQuery( dummy, true, true );
84
// "a b","b c" => "a b","b c","a b c"
85
Set<Query> flatQueries = new HashSet<Query>();
86
flatQueries.add( pqF( "a", "b" ) );
87
flatQueries.add( pqF( "b", "c" ) );
88
assertCollectionQueries( fq.expand( flatQueries ),
89
pqF( "a", "b" ), pqF( "b", "c" ), pqF( "a", "b", "c" ) );
91
// "a b","b c d" => "a b","b c d","a b c d"
92
flatQueries = new HashSet<Query>();
93
flatQueries.add( pqF( "a", "b" ) );
94
flatQueries.add( pqF( "b", "c", "d" ) );
95
assertCollectionQueries( fq.expand( flatQueries ),
96
pqF( "a", "b" ), pqF( "b", "c", "d" ), pqF( "a", "b", "c", "d" ) );
98
// "a b c","b c d" => "a b c","b c d","a b c d"
99
flatQueries = new HashSet<Query>();
100
flatQueries.add( pqF( "a", "b", "c" ) );
101
flatQueries.add( pqF( "b", "c", "d" ) );
102
assertCollectionQueries( fq.expand( flatQueries ),
103
pqF( "a", "b", "c" ), pqF( "b", "c", "d" ), pqF( "a", "b", "c", "d" ) );
105
// "a b c","c d e" => "a b c","c d e","a b c d e"
106
flatQueries = new HashSet<Query>();
107
flatQueries.add( pqF( "a", "b", "c" ) );
108
flatQueries.add( pqF( "c", "d", "e" ) );
109
assertCollectionQueries( fq.expand( flatQueries ),
110
pqF( "a", "b", "c" ), pqF( "c", "d", "e" ), pqF( "a", "b", "c", "d", "e" ) );
112
// "a b c d","b c" => "a b c d","b c"
113
flatQueries = new HashSet<Query>();
114
flatQueries.add( pqF( "a", "b", "c", "d" ) );
115
flatQueries.add( pqF( "b", "c" ) );
116
assertCollectionQueries( fq.expand( flatQueries ),
117
pqF( "a", "b", "c", "d" ), pqF( "b", "c" ) );
119
// "a b b","b c" => "a b b","b c","a b b c"
120
flatQueries = new HashSet<Query>();
121
flatQueries.add( pqF( "a", "b", "b" ) );
122
flatQueries.add( pqF( "b", "c" ) );
123
assertCollectionQueries( fq.expand( flatQueries ),
124
pqF( "a", "b", "b" ), pqF( "b", "c" ), pqF( "a", "b", "b", "c" ) );
126
// "a b","b a" => "a b","b a","a b a", "b a b"
127
flatQueries = new HashSet<Query>();
128
flatQueries.add( pqF( "a", "b" ) );
129
flatQueries.add( pqF( "b", "a" ) );
130
assertCollectionQueries( fq.expand( flatQueries ),
131
pqF( "a", "b" ), pqF( "b", "a" ), pqF( "a", "b", "a" ), pqF( "b", "a", "b" ) );
133
// "a b","a b c" => "a b","a b c"
134
flatQueries = new HashSet<Query>();
135
flatQueries.add( pqF( "a", "b" ) );
136
flatQueries.add( pqF( "a", "b", "c" ) );
137
assertCollectionQueries( fq.expand( flatQueries ),
138
pqF( "a", "b" ), pqF( "a", "b", "c" ) );
141
public void testNoExpand() throws Exception {
142
Query dummy = pqF( "DUMMY" );
143
FieldQuery fq = new FieldQuery( dummy, true, true );
145
// "a b","c d" => "a b","c d"
146
Set<Query> flatQueries = new HashSet<Query>();
147
flatQueries.add( pqF( "a", "b" ) );
148
flatQueries.add( pqF( "c", "d" ) );
149
assertCollectionQueries( fq.expand( flatQueries ),
150
pqF( "a", "b" ), pqF( "c", "d" ) );
152
// "a","a b" => "a", "a b"
153
flatQueries = new HashSet<Query>();
154
flatQueries.add( tq( "a" ) );
155
flatQueries.add( pqF( "a", "b" ) );
156
assertCollectionQueries( fq.expand( flatQueries ),
157
tq( "a" ), pqF( "a", "b" ) );
159
// "a b","b" => "a b", "b"
160
flatQueries = new HashSet<Query>();
161
flatQueries.add( pqF( "a", "b" ) );
162
flatQueries.add( tq( "b" ) );
163
assertCollectionQueries( fq.expand( flatQueries ),
164
pqF( "a", "b" ), tq( "b" ) );
166
// "a b c","b c" => "a b c","b c"
167
flatQueries = new HashSet<Query>();
168
flatQueries.add( pqF( "a", "b", "c" ) );
169
flatQueries.add( pqF( "b", "c" ) );
170
assertCollectionQueries( fq.expand( flatQueries ),
171
pqF( "a", "b", "c" ), pqF( "b", "c" ) );
173
// "a b","a b c" => "a b","a b c"
174
flatQueries = new HashSet<Query>();
175
flatQueries.add( pqF( "a", "b" ) );
176
flatQueries.add( pqF( "a", "b", "c" ) );
177
assertCollectionQueries( fq.expand( flatQueries ),
178
pqF( "a", "b" ), pqF( "a", "b", "c" ) );
180
// "a b c","b d e" => "a b c","b d e"
181
flatQueries = new HashSet<Query>();
182
flatQueries.add( pqF( "a", "b", "c" ) );
183
flatQueries.add( pqF( "b", "d", "e" ) );
184
assertCollectionQueries( fq.expand( flatQueries ),
185
pqF( "a", "b", "c" ), pqF( "b", "d", "e" ) );
188
public void testExpandNotFieldMatch() throws Exception {
189
Query dummy = pqF( "DUMMY" );
190
FieldQuery fq = new FieldQuery( dummy, true, false );
192
// f1:"a b",f2:"b c" => f1:"a b",f2:"b c",f1:"a b c"
193
Set<Query> flatQueries = new HashSet<Query>();
194
flatQueries.add( pq( F1, "a", "b" ) );
195
flatQueries.add( pq( F2, "b", "c" ) );
196
assertCollectionQueries( fq.expand( flatQueries ),
197
pq( F1, "a", "b" ), pq( F2, "b", "c" ), pq( F1, "a", "b", "c" ) );
200
public void testGetFieldTermMap() throws Exception {
201
Query query = tq( "a" );
202
FieldQuery fq = new FieldQuery( query, true, true );
204
QueryPhraseMap pqm = fq.getFieldTermMap( F, "a" );
205
assertNotNull( pqm );
206
assertTrue( pqm.isTerminal() );
208
pqm = fq.getFieldTermMap( F, "b" );
211
pqm = fq.getFieldTermMap( F1, "a" );
215
public void testGetRootMap() throws Exception {
216
Query dummy = pqF( "DUMMY" );
217
FieldQuery fq = new FieldQuery( dummy, true, true );
219
QueryPhraseMap rootMap1 = fq.getRootMap( tq( "a" ) );
220
QueryPhraseMap rootMap2 = fq.getRootMap( tq( "a" ) );
221
assertTrue( rootMap1 == rootMap2 );
222
QueryPhraseMap rootMap3 = fq.getRootMap( tq( "b" ) );
223
assertTrue( rootMap1 == rootMap3 );
224
QueryPhraseMap rootMap4 = fq.getRootMap( tq( F1, "b" ) );
225
assertFalse( rootMap4 == rootMap3 );
228
public void testGetRootMapNotFieldMatch() throws Exception {
229
Query dummy = pqF( "DUMMY" );
230
FieldQuery fq = new FieldQuery( dummy, true, false );
232
QueryPhraseMap rootMap1 = fq.getRootMap( tq( "a" ) );
233
QueryPhraseMap rootMap2 = fq.getRootMap( tq( "a" ) );
234
assertTrue( rootMap1 == rootMap2 );
235
QueryPhraseMap rootMap3 = fq.getRootMap( tq( "b" ) );
236
assertTrue( rootMap1 == rootMap3 );
237
QueryPhraseMap rootMap4 = fq.getRootMap( tq( F1, "b" ) );
238
assertTrue( rootMap4 == rootMap3 );
241
public void testGetTermSet() throws Exception {
242
Query query = paW.parse( "A AND B OR x:C NOT (D AND E)" );
243
FieldQuery fq = new FieldQuery( query, true, true );
244
assertEquals( 2, fq.termSetMap.size() );
245
Set<String> termSet = fq.getTermSet( F );
246
assertEquals( 2, termSet.size() );
247
assertTrue( termSet.contains( "A" ) );
248
assertTrue( termSet.contains( "B" ) );
249
termSet = fq.getTermSet( "x" );
250
assertEquals( 1, termSet.size() );
251
assertTrue( termSet.contains( "C" ) );
252
termSet = fq.getTermSet( "y" );
253
assertNull( termSet );
256
public void testQueryPhraseMap1Term() throws Exception {
257
Query query = tq( "a" );
259
// phraseHighlight = true, fieldMatch = true
260
FieldQuery fq = new FieldQuery( query, true, true );
261
Map<String, QueryPhraseMap> map = fq.rootMaps;
262
assertEquals( 1, map.size() );
263
assertNull( map.get( null ) );
264
assertNotNull( map.get( F ) );
265
QueryPhraseMap qpm = map.get( F );
266
assertEquals( 1, qpm.subMap.size() );
267
assertTrue( qpm.subMap.get( "a" ) != null );
268
assertTrue( qpm.subMap.get( "a" ).terminal );
269
assertEquals( 1F, qpm.subMap.get( "a" ).boost, 0);
271
// phraseHighlight = true, fieldMatch = false
272
fq = new FieldQuery( query, true, false );
274
assertEquals( 1, map.size() );
275
assertNull( map.get( F ) );
276
assertNotNull( map.get( null ) );
277
qpm = map.get( null );
278
assertEquals( 1, qpm.subMap.size() );
279
assertTrue( qpm.subMap.get( "a" ) != null );
280
assertTrue( qpm.subMap.get( "a" ).terminal );
281
assertEquals( 1F, qpm.subMap.get( "a" ).boost, 0);
283
// phraseHighlight = false, fieldMatch = true
284
fq = new FieldQuery( query, false, true );
286
assertEquals( 1, map.size() );
287
assertNull( map.get( null ) );
288
assertNotNull( map.get( F ) );
290
assertEquals( 1, qpm.subMap.size() );
291
assertTrue( qpm.subMap.get( "a" ) != null );
292
assertTrue( qpm.subMap.get( "a" ).terminal );
293
assertEquals( 1F, qpm.subMap.get( "a" ).boost, 0);
295
// phraseHighlight = false, fieldMatch = false
296
fq = new FieldQuery( query, false, false );
298
assertEquals( 1, map.size() );
299
assertNull( map.get( F ) );
300
assertNotNull( map.get( null ) );
301
qpm = map.get( null );
302
assertEquals( 1, qpm.subMap.size() );
303
assertTrue( qpm.subMap.get( "a" ) != null );
304
assertTrue( qpm.subMap.get( "a" ).terminal );
305
assertEquals( 1F, qpm.subMap.get( "a" ).boost, 0);
308
query = tq( 2, "a" );
309
fq = new FieldQuery( query, true, true );
312
assertEquals( 2F, qpm.subMap.get( "a" ).boost, 0);
315
public void testQueryPhraseMap1Phrase() throws Exception {
316
Query query = pqF( "a", "b" );
318
// phraseHighlight = true, fieldMatch = true
319
FieldQuery fq = new FieldQuery( query, true, true );
320
Map<String, QueryPhraseMap> map = fq.rootMaps;
321
assertEquals( 1, map.size() );
322
assertNull( map.get( null ) );
323
assertNotNull( map.get( F ) );
324
QueryPhraseMap qpm = map.get( F );
325
assertEquals( 1, qpm.subMap.size() );
326
assertNotNull( qpm.subMap.get( "a" ) );
327
QueryPhraseMap qpm2 = qpm.subMap.get( "a" );
328
assertFalse( qpm2.terminal );
329
assertEquals( 1, qpm2.subMap.size() );
330
assertNotNull( qpm2.subMap.get( "b" ) );
331
QueryPhraseMap qpm3 = qpm2.subMap.get( "b" );
332
assertTrue( qpm3.terminal );
333
assertEquals( 1F, qpm3.boost, 0);
335
// phraseHighlight = true, fieldMatch = false
336
fq = new FieldQuery( query, true, false );
338
assertEquals( 1, map.size() );
339
assertNull( map.get( F ) );
340
assertNotNull( map.get( null ) );
341
qpm = map.get( null );
342
assertEquals( 1, qpm.subMap.size() );
343
assertNotNull( qpm.subMap.get( "a" ) );
344
qpm2 = qpm.subMap.get( "a" );
345
assertFalse( qpm2.terminal );
346
assertEquals( 1, qpm2.subMap.size() );
347
assertNotNull( qpm2.subMap.get( "b" ) );
348
qpm3 = qpm2.subMap.get( "b" );
349
assertTrue( qpm3.terminal );
350
assertEquals( 1F, qpm3.boost, 0);
352
// phraseHighlight = false, fieldMatch = true
353
fq = new FieldQuery( query, false, true );
355
assertEquals( 1, map.size() );
356
assertNull( map.get( null ) );
357
assertNotNull( map.get( F ) );
359
assertEquals( 2, qpm.subMap.size() );
360
assertNotNull( qpm.subMap.get( "a" ) );
361
qpm2 = qpm.subMap.get( "a" );
362
assertTrue( qpm2.terminal );
363
assertEquals( 1F, qpm2.boost, 0);
364
assertEquals( 1, qpm2.subMap.size() );
365
assertNotNull( qpm2.subMap.get( "b" ) );
366
qpm3 = qpm2.subMap.get( "b" );
367
assertTrue( qpm3.terminal );
368
assertEquals( 1F, qpm3.boost, 0);
370
assertNotNull( qpm.subMap.get( "b" ) );
371
qpm2 = qpm.subMap.get( "b" );
372
assertTrue( qpm2.terminal );
373
assertEquals( 1F, qpm2.boost, 0);
375
// phraseHighlight = false, fieldMatch = false
376
fq = new FieldQuery( query, false, false );
378
assertEquals( 1, map.size() );
379
assertNull( map.get( F ) );
380
assertNotNull( map.get( null ) );
381
qpm = map.get( null );
382
assertEquals( 2, qpm.subMap.size() );
383
assertNotNull( qpm.subMap.get( "a" ) );
384
qpm2 = qpm.subMap.get( "a" );
385
assertTrue( qpm2.terminal );
386
assertEquals( 1F, qpm2.boost, 0);
387
assertEquals( 1, qpm2.subMap.size() );
388
assertNotNull( qpm2.subMap.get( "b" ) );
389
qpm3 = qpm2.subMap.get( "b" );
390
assertTrue( qpm3.terminal );
391
assertEquals( 1F, qpm3.boost, 0);
393
assertNotNull( qpm.subMap.get( "b" ) );
394
qpm2 = qpm.subMap.get( "b" );
395
assertTrue( qpm2.terminal );
396
assertEquals( 1F, qpm2.boost, 0);
399
query = pqF( 2, "a", "b" );
400
// phraseHighlight = false, fieldMatch = false
401
fq = new FieldQuery( query, false, false );
403
qpm = map.get( null );
404
qpm2 = qpm.subMap.get( "a" );
405
assertEquals( 2F, qpm2.boost, 0);
406
qpm3 = qpm2.subMap.get( "b" );
407
assertEquals( 2F, qpm3.boost, 0);
408
qpm2 = qpm.subMap.get( "b" );
409
assertEquals( 2F, qpm2.boost, 0);
412
public void testQueryPhraseMap1PhraseAnother() throws Exception {
413
Query query = pqF( "search", "engines" );
415
// phraseHighlight = true, fieldMatch = true
416
FieldQuery fq = new FieldQuery( query, true, true );
417
Map<String, QueryPhraseMap> map = fq.rootMaps;
418
assertEquals( 1, map.size() );
419
assertNull( map.get( null ) );
420
assertNotNull( map.get( F ) );
421
QueryPhraseMap qpm = map.get( F );
422
assertEquals( 1, qpm.subMap.size() );
423
assertNotNull( qpm.subMap.get( "search" ) );
424
QueryPhraseMap qpm2 = qpm.subMap.get( "search" );
425
assertFalse( qpm2.terminal );
426
assertEquals( 1, qpm2.subMap.size() );
427
assertNotNull( qpm2.subMap.get( "engines" ) );
428
QueryPhraseMap qpm3 = qpm2.subMap.get( "engines" );
429
assertTrue( qpm3.terminal );
430
assertEquals( 1F, qpm3.boost, 0);
433
public void testQueryPhraseMap2Phrases() throws Exception {
434
BooleanQuery query = new BooleanQuery();
435
query.add( pqF( "a", "b" ), Occur.SHOULD );
436
query.add( pqF( 2, "c", "d" ), Occur.SHOULD );
438
// phraseHighlight = true, fieldMatch = true
439
FieldQuery fq = new FieldQuery( query, true, true );
440
Map<String, QueryPhraseMap> map = fq.rootMaps;
441
assertEquals( 1, map.size() );
442
assertNull( map.get( null ) );
443
assertNotNull( map.get( F ) );
444
QueryPhraseMap qpm = map.get( F );
445
assertEquals( 2, qpm.subMap.size() );
448
assertNotNull( qpm.subMap.get( "a" ) );
449
QueryPhraseMap qpm2 = qpm.subMap.get( "a" );
450
assertFalse( qpm2.terminal );
451
assertEquals( 1, qpm2.subMap.size() );
452
assertNotNull( qpm2.subMap.get( "b" ) );
453
QueryPhraseMap qpm3 = qpm2.subMap.get( "b" );
454
assertTrue( qpm3.terminal );
455
assertEquals( 1F, qpm3.boost, 0);
458
assertNotNull( qpm.subMap.get( "c" ) );
459
qpm2 = qpm.subMap.get( "c" );
460
assertFalse( qpm2.terminal );
461
assertEquals( 1, qpm2.subMap.size() );
462
assertNotNull( qpm2.subMap.get( "d" ) );
463
qpm3 = qpm2.subMap.get( "d" );
464
assertTrue( qpm3.terminal );
465
assertEquals( 2F, qpm3.boost, 0);
468
public void testQueryPhraseMap2PhrasesFields() throws Exception {
469
BooleanQuery query = new BooleanQuery();
470
query.add( pq( F1, "a", "b" ), Occur.SHOULD );
471
query.add( pq( 2F, F2, "c", "d" ), Occur.SHOULD );
473
// phraseHighlight = true, fieldMatch = true
474
FieldQuery fq = new FieldQuery( query, true, true );
475
Map<String, QueryPhraseMap> map = fq.rootMaps;
476
assertEquals( 2, map.size() );
477
assertNull( map.get( null ) );
480
assertNotNull( map.get( F1 ) );
481
QueryPhraseMap qpm = map.get( F1 );
482
assertEquals( 1, qpm.subMap.size() );
483
assertNotNull( qpm.subMap.get( "a" ) );
484
QueryPhraseMap qpm2 = qpm.subMap.get( "a" );
485
assertFalse( qpm2.terminal );
486
assertEquals( 1, qpm2.subMap.size() );
487
assertNotNull( qpm2.subMap.get( "b" ) );
488
QueryPhraseMap qpm3 = qpm2.subMap.get( "b" );
489
assertTrue( qpm3.terminal );
490
assertEquals( 1F, qpm3.boost, 0);
493
assertNotNull( map.get( F2 ) );
495
assertEquals( 1, qpm.subMap.size() );
496
assertNotNull( qpm.subMap.get( "c" ) );
497
qpm2 = qpm.subMap.get( "c" );
498
assertFalse( qpm2.terminal );
499
assertEquals( 1, qpm2.subMap.size() );
500
assertNotNull( qpm2.subMap.get( "d" ) );
501
qpm3 = qpm2.subMap.get( "d" );
502
assertTrue( qpm3.terminal );
503
assertEquals( 2F, qpm3.boost, 0);
505
// phraseHighlight = true, fieldMatch = false
506
fq = new FieldQuery( query, true, false );
508
assertEquals( 1, map.size() );
509
assertNull( map.get( F1 ) );
510
assertNull( map.get( F2 ) );
511
assertNotNull( map.get( null ) );
512
qpm = map.get( null );
513
assertEquals( 2, qpm.subMap.size() );
516
assertNotNull( qpm.subMap.get( "a" ) );
517
qpm2 = qpm.subMap.get( "a" );
518
assertFalse( qpm2.terminal );
519
assertEquals( 1, qpm2.subMap.size() );
520
assertNotNull( qpm2.subMap.get( "b" ) );
521
qpm3 = qpm2.subMap.get( "b" );
522
assertTrue( qpm3.terminal );
523
assertEquals( 1F, qpm3.boost, 0);
526
assertNotNull( qpm.subMap.get( "c" ) );
527
qpm2 = qpm.subMap.get( "c" );
528
assertFalse( qpm2.terminal );
529
assertEquals( 1, qpm2.subMap.size() );
530
assertNotNull( qpm2.subMap.get( "d" ) );
531
qpm3 = qpm2.subMap.get( "d" );
532
assertTrue( qpm3.terminal );
533
assertEquals( 2F, qpm3.boost, 0);
544
public void testQueryPhraseMapOverlapPhrases() throws Exception {
545
BooleanQuery query = new BooleanQuery();
546
query.add( pqF( "a", "b", "c" ), Occur.SHOULD );
547
query.add( pqF( 2, "b", "c", "d" ), Occur.SHOULD );
548
query.add( pqF( 3, "b", "d" ), Occur.SHOULD );
550
// phraseHighlight = true, fieldMatch = true
551
FieldQuery fq = new FieldQuery( query, true, true );
552
Map<String, QueryPhraseMap> map = fq.rootMaps;
553
assertEquals( 1, map.size() );
554
assertNull( map.get( null ) );
555
assertNotNull( map.get( F ) );
556
QueryPhraseMap qpm = map.get( F );
557
assertEquals( 2, qpm.subMap.size() );
560
assertNotNull( qpm.subMap.get( "a" ) );
561
QueryPhraseMap qpm2 = qpm.subMap.get( "a" );
562
assertFalse( qpm2.terminal );
563
assertEquals( 1, qpm2.subMap.size() );
564
assertNotNull( qpm2.subMap.get( "b" ) );
565
QueryPhraseMap qpm3 = qpm2.subMap.get( "b" );
566
assertFalse( qpm3.terminal );
567
assertEquals( 1, qpm3.subMap.size() );
568
assertNotNull( qpm3.subMap.get( "c" ) );
569
QueryPhraseMap qpm4 = qpm3.subMap.get( "c" );
570
assertTrue( qpm4.terminal );
571
assertEquals( 1F, qpm4.boost, 0);
572
assertNotNull( qpm4.subMap.get( "d" ) );
573
QueryPhraseMap qpm5 = qpm4.subMap.get( "d" );
574
assertTrue( qpm5.terminal );
575
assertEquals( 1F, qpm5.boost, 0);
577
// "b c d"^2, "b d"^3
578
assertNotNull( qpm.subMap.get( "b" ) );
579
qpm2 = qpm.subMap.get( "b" );
580
assertFalse( qpm2.terminal );
581
assertEquals( 2, qpm2.subMap.size() );
582
assertNotNull( qpm2.subMap.get( "c" ) );
583
qpm3 = qpm2.subMap.get( "c" );
584
assertFalse( qpm3.terminal );
585
assertEquals( 1, qpm3.subMap.size() );
586
assertNotNull( qpm3.subMap.get( "d" ) );
587
qpm4 = qpm3.subMap.get( "d" );
588
assertTrue( qpm4.terminal );
589
assertEquals( 2F, qpm4.boost, 0);
590
assertNotNull( qpm2.subMap.get( "d" ) );
591
qpm3 = qpm2.subMap.get( "d" );
592
assertTrue( qpm3.terminal );
593
assertEquals( 3F, qpm3.boost, 0);
602
public void testQueryPhraseMapOverlapPhrases2() throws Exception {
603
BooleanQuery query = new BooleanQuery();
604
query.add( pqF( "a", "b" ), Occur.SHOULD );
605
query.add( pqF( 2, "a", "b", "c" ), Occur.SHOULD );
607
// phraseHighlight = true, fieldMatch = true
608
FieldQuery fq = new FieldQuery( query, true, true );
609
Map<String, QueryPhraseMap> map = fq.rootMaps;
610
assertEquals( 1, map.size() );
611
assertNull( map.get( null ) );
612
assertNotNull( map.get( F ) );
613
QueryPhraseMap qpm = map.get( F );
614
assertEquals( 1, qpm.subMap.size() );
617
assertNotNull( qpm.subMap.get( "a" ) );
618
QueryPhraseMap qpm2 = qpm.subMap.get( "a" );
619
assertFalse( qpm2.terminal );
620
assertEquals( 1, qpm2.subMap.size() );
621
assertNotNull( qpm2.subMap.get( "b" ) );
622
QueryPhraseMap qpm3 = qpm2.subMap.get( "b" );
623
assertTrue( qpm3.terminal );
624
assertEquals( 1F, qpm3.boost, 0);
627
assertEquals( 1, qpm3.subMap.size() );
628
assertNotNull( qpm3.subMap.get( "c" ) );
629
QueryPhraseMap qpm4 = qpm3.subMap.get( "c" );
630
assertTrue( qpm4.terminal );
631
assertEquals( 2F, qpm4.boost, 0);
642
public void testQueryPhraseMapOverlapPhrases3() throws Exception {
643
BooleanQuery query = new BooleanQuery();
644
query.add( pqF( "a", "a", "a", "a" ), Occur.SHOULD );
645
query.add( pqF( 2, "a", "a", "a" ), Occur.SHOULD );
647
// phraseHighlight = true, fieldMatch = true
648
FieldQuery fq = new FieldQuery( query, true, true );
649
Map<String, QueryPhraseMap> map = fq.rootMaps;
650
assertEquals( 1, map.size() );
651
assertNull( map.get( null ) );
652
assertNotNull( map.get( F ) );
653
QueryPhraseMap qpm = map.get( F );
654
assertEquals( 1, qpm.subMap.size() );
657
assertNotNull( qpm.subMap.get( "a" ) );
658
QueryPhraseMap qpm2 = qpm.subMap.get( "a" );
659
assertFalse( qpm2.terminal );
660
assertEquals( 1, qpm2.subMap.size() );
661
assertNotNull( qpm2.subMap.get( "a" ) );
662
QueryPhraseMap qpm3 = qpm2.subMap.get( "a" );
663
assertFalse( qpm3.terminal );
664
assertEquals( 1, qpm3.subMap.size() );
665
assertNotNull( qpm3.subMap.get( "a" ) );
666
QueryPhraseMap qpm4 = qpm3.subMap.get( "a" );
667
assertTrue( qpm4.terminal );
670
assertEquals( 1, qpm4.subMap.size() );
671
assertNotNull( qpm4.subMap.get( "a" ) );
672
QueryPhraseMap qpm5 = qpm4.subMap.get( "a" );
673
assertTrue( qpm5.terminal );
676
assertEquals( 1, qpm5.subMap.size() );
677
assertNotNull( qpm5.subMap.get( "a" ) );
678
QueryPhraseMap qpm6 = qpm5.subMap.get( "a" );
679
assertTrue( qpm6.terminal );
682
assertEquals( 1, qpm6.subMap.size() );
683
assertNotNull( qpm6.subMap.get( "a" ) );
684
QueryPhraseMap qpm7 = qpm6.subMap.get( "a" );
685
assertTrue( qpm7.terminal );
688
public void testQueryPhraseMapOverlap2gram() throws Exception {
689
Query query = paB.parse( "\"abc\" AND \"bcd\"" );
691
// phraseHighlight = true, fieldMatch = true
692
FieldQuery fq = new FieldQuery( query, true, true );
693
Map<String, QueryPhraseMap> map = fq.rootMaps;
694
assertEquals( 1, map.size() );
695
assertNull( map.get( null ) );
696
assertNotNull( map.get( F ) );
697
QueryPhraseMap qpm = map.get( F );
698
assertEquals( 2, qpm.subMap.size() );
701
assertNotNull( qpm.subMap.get( "ab" ) );
702
QueryPhraseMap qpm2 = qpm.subMap.get( "ab" );
703
assertFalse( qpm2.terminal );
704
assertEquals( 1, qpm2.subMap.size() );
705
assertNotNull( qpm2.subMap.get( "bc" ) );
706
QueryPhraseMap qpm3 = qpm2.subMap.get( "bc" );
707
assertTrue( qpm3.terminal );
708
assertEquals( 1F, qpm3.boost, 0);
711
assertEquals( 1, qpm3.subMap.size() );
712
assertNotNull( qpm3.subMap.get( "cd" ) );
713
QueryPhraseMap qpm4 = qpm3.subMap.get( "cd" );
714
assertTrue( qpm4.terminal );
715
assertEquals( 1F, qpm4.boost, 0);
718
assertNotNull( qpm.subMap.get( "bc" ) );
719
qpm2 = qpm.subMap.get( "bc" );
720
assertFalse( qpm2.terminal );
721
assertEquals( 1, qpm2.subMap.size() );
722
assertNotNull( qpm2.subMap.get( "cd" ) );
723
qpm3 = qpm2.subMap.get( "cd" );
724
assertTrue( qpm3.terminal );
725
assertEquals( 1F, qpm3.boost, 0);
727
// phraseHighlight = false, fieldMatch = true
728
fq = new FieldQuery( query, false, true );
730
assertEquals( 1, map.size() );
731
assertNull( map.get( null ) );
732
assertNotNull( map.get( F ) );
734
assertEquals( 3, qpm.subMap.size() );
737
assertNotNull( qpm.subMap.get( "ab" ) );
738
qpm2 = qpm.subMap.get( "ab" );
739
assertTrue( qpm2.terminal );
740
assertEquals( 1F, qpm2.boost, 0);
741
assertEquals( 1, qpm2.subMap.size() );
742
assertNotNull( qpm2.subMap.get( "bc" ) );
743
qpm3 = qpm2.subMap.get( "bc" );
744
assertTrue( qpm3.terminal );
745
assertEquals( 1F, qpm3.boost, 0);
748
assertEquals( 1, qpm3.subMap.size() );
749
assertNotNull( qpm3.subMap.get( "cd" ) );
750
qpm4 = qpm3.subMap.get( "cd" );
751
assertTrue( qpm4.terminal );
752
assertEquals( 1F, qpm4.boost, 0);
755
assertNotNull( qpm.subMap.get( "bc" ) );
756
qpm2 = qpm.subMap.get( "bc" );
757
assertTrue( qpm2.terminal );
758
assertEquals( 1F, qpm2.boost, 0);
759
assertEquals( 1, qpm2.subMap.size() );
760
assertNotNull( qpm2.subMap.get( "cd" ) );
761
qpm3 = qpm2.subMap.get( "cd" );
762
assertTrue( qpm3.terminal );
763
assertEquals( 1F, qpm3.boost, 0);
766
assertNotNull( qpm.subMap.get( "cd" ) );
767
qpm2 = qpm.subMap.get( "cd" );
768
assertTrue( qpm2.terminal );
769
assertEquals( 1F, qpm2.boost, 0);
770
assertEquals( 0, qpm2.subMap.size() );
773
public void testSearchPhrase() throws Exception {
774
Query query = pqF( "a", "b", "c" );
776
// phraseHighlight = true, fieldMatch = true
777
FieldQuery fq = new FieldQuery( query, true, true );
780
List<TermInfo> phraseCandidate = new ArrayList<TermInfo>();
781
phraseCandidate.add( new TermInfo( "a", 0, 1, 0 ) );
782
assertNull( fq.searchPhrase( F, phraseCandidate ) );
784
phraseCandidate.add( new TermInfo( "b", 2, 3, 1 ) );
785
assertNull( fq.searchPhrase( F, phraseCandidate ) );
787
phraseCandidate.add( new TermInfo( "c", 4, 5, 2 ) );
788
assertNotNull( fq.searchPhrase( F, phraseCandidate ) );
789
assertNull( fq.searchPhrase( "x", phraseCandidate ) );
791
// phraseHighlight = true, fieldMatch = false
792
fq = new FieldQuery( query, true, false );
795
assertNotNull( fq.searchPhrase( F, phraseCandidate ) );
796
assertNotNull( fq.searchPhrase( "x", phraseCandidate ) );
798
// phraseHighlight = false, fieldMatch = true
799
fq = new FieldQuery( query, false, true );
802
phraseCandidate.clear();
803
phraseCandidate.add( new TermInfo( "a", 0, 1, 0 ) );
804
assertNotNull( fq.searchPhrase( F, phraseCandidate ) );
806
phraseCandidate.add( new TermInfo( "b", 2, 3, 1 ) );
807
assertNull( fq.searchPhrase( F, phraseCandidate ) );
809
phraseCandidate.add( new TermInfo( "c", 4, 5, 2 ) );
810
assertNotNull( fq.searchPhrase( F, phraseCandidate ) );
811
assertNull( fq.searchPhrase( "x", phraseCandidate ) );
814
public void testSearchPhraseSlop() throws Exception {
816
Query query = pqF( "a", "b", "c" );
818
// phraseHighlight = true, fieldMatch = true
819
FieldQuery fq = new FieldQuery( query, true, true );
821
// "a b c" w/ position-gap = 2
822
List<TermInfo> phraseCandidate = new ArrayList<TermInfo>();
823
phraseCandidate.add( new TermInfo( "a", 0, 1, 0 ) );
824
phraseCandidate.add( new TermInfo( "b", 2, 3, 2 ) );
825
phraseCandidate.add( new TermInfo( "c", 4, 5, 4 ) );
826
assertNull( fq.searchPhrase( F, phraseCandidate ) );
829
query = pqF( 1F, 1, "a", "b", "c" );
831
// phraseHighlight = true, fieldMatch = true
832
fq = new FieldQuery( query, true, true );
834
// "a b c" w/ position-gap = 2
835
assertNotNull( fq.searchPhrase( F, phraseCandidate ) );
837
// "a b c" w/ position-gap = 3
838
phraseCandidate.clear();
839
phraseCandidate.add( new TermInfo( "a", 0, 1, 0 ) );
840
phraseCandidate.add( new TermInfo( "b", 2, 3, 3 ) );
841
phraseCandidate.add( new TermInfo( "c", 4, 5, 6 ) );
842
assertNull( fq.searchPhrase( F, phraseCandidate ) );
845
public void testHighlightQuery() throws Exception {
847
defgMultiTermQueryTest(new WildcardQuery(new Term(F, "d*g")));
850
public void testPrefixQuery() throws Exception {
852
defgMultiTermQueryTest(new PrefixQuery(new Term(F, "de")));
855
public void testRegexQuery() throws Exception {
857
Term term = new Term(F, "d[a-z].g");
858
defgMultiTermQueryTest(new RegexQuery(term));
861
public void testRangeQuery() throws Exception {
863
defgMultiTermQueryTest(new TermRangeQuery (F, "d", "e", true, true));
866
private void defgMultiTermQueryTest(Query query) throws IOException {
867
FieldQuery fq = new FieldQuery( query, reader, true, true );
868
QueryPhraseMap qpm = fq.getFieldTermMap(F, "defg");
870
assertNull (fq.getFieldTermMap(F, "dog"));
871
List<TermInfo> phraseCandidate = new ArrayList<TermInfo>();
872
phraseCandidate.add( new TermInfo( "defg", 0, 12, 0 ) );
873
assertNotNull (fq.searchPhrase(F, phraseCandidate));