@@ -500,22 +500,41 @@ public Query termsQuery(List<?> values, QueryShardContext context) {
500
500
return super .termsQuery (values , context );
501
501
}
502
502
BytesRefsCollectionBuilder iBytesRefs = new BytesRefsCollectionBuilder (values .size ());
503
- BytesRefsCollectionBuilder dVByteRefs = new BytesRefsCollectionBuilder (values .size ());
503
+ BytesRefsCollectionBuilder dVByteRefs = null ; // = new BytesRefsCollectionBuilder(values.size());
504
504
for (int i = 0 ; i < values .size (); i ++) {
505
- BytesRef idxBytes = indexedValueForSearch (values .get (i ));
505
+ Object value = values .get (i );
506
+ BytesRef idxBytes = indexedValueForSearch (value );
506
507
iBytesRefs .accept (idxBytes );
507
- BytesRef dvBytes = indexedValueForSearch (rewriteForDocValue (values .get (i )));
508
- dVByteRefs .accept (dvBytes );
508
+
509
+ Object rewritten = rewriteForDocValue (value );
510
+ if (dVByteRefs == null ) { // need check
511
+ if (rewritten != value && !rewritten .equals (value )) {
512
+ // first time see the difference between index and doc values, let's clone
513
+ dVByteRefs = new BytesRefsCollectionBuilder (values .size ());
514
+ for (int rewind = 0 ; rewind <= i ; rewind ++) {
515
+ Object rewrittenOld = rewind < i ? rewriteForDocValue (values .get (rewind )) : rewritten ;
516
+ BytesRef dvBytesOld = indexedValueForSearch (rewrittenOld );
517
+ dVByteRefs .accept (dvBytesOld );
518
+ }
519
+ }
520
+ } else {
521
+ BytesRef dvBytes = indexedValueForSearch (rewritten );
522
+ dVByteRefs .accept (dvBytes );
523
+ }
524
+ }
525
+ if (dVByteRefs == null ) { // index and docValues are the same, pack them once
526
+ return TermInSetQuery .newIndexOrDocValuesQuery (MultiTermQuery .CONSTANT_SCORE_BLENDED_REWRITE , name (), iBytesRefs .get ());
527
+ } else {
528
+ Query indexQuery = new TermInSetQuery (MultiTermQuery .CONSTANT_SCORE_BLENDED_REWRITE , name (), iBytesRefs .get ());
529
+ Query dvQuery = new TermInSetQuery (MultiTermQuery .DOC_VALUES_REWRITE , name (), dVByteRefs .get ());
530
+ return new IndexOrDocValuesQuery (indexQuery , dvQuery );
509
531
}
510
- Query indexQuery = new TermInSetQuery (MultiTermQuery .CONSTANT_SCORE_BLENDED_REWRITE , name (), iBytesRefs .get ());
511
- Query dvQuery = new TermInSetQuery (MultiTermQuery .DOC_VALUES_REWRITE , name (), dVByteRefs .get ());
512
- return new IndexOrDocValuesQuery (indexQuery , dvQuery );
513
532
}
514
533
// if we only have doc_values enabled, we construct a new query with doc_values re-written
515
534
if (hasDocValues ()) {
516
535
BytesRefsCollectionBuilder bytesCollector = new BytesRefsCollectionBuilder (values .size ());
517
- for (int i = 0 ; i < values . size (); i ++ ) {
518
- BytesRef dvBytes = indexedValueForSearch (rewriteForDocValue (values . get ( i ) ));
536
+ for (Object value : values ) {
537
+ BytesRef dvBytes = indexedValueForSearch (rewriteForDocValue (value ));
519
538
bytesCollector .accept (dvBytes );
520
539
}
521
540
return new TermInSetQuery (MultiTermQuery .DOC_VALUES_REWRITE , name (), bytesCollector .get ());
0 commit comments