@@ -102,6 +102,8 @@ public class NumberFieldMapper extends ParametrizedFieldMapper {
102102
103103 public static final Setting <Boolean > COERCE_SETTING = Setting .boolSetting ("index.mapping.coerce" , true , Property .IndexScope );
104104
105+ private static final int APPROX_QUERY_NUMERIC_DIMS = 1 ;
106+
105107 private static NumberFieldMapper toType (FieldMapper in ) {
106108 return (NumberFieldMapper ) in ;
107109 }
@@ -356,23 +358,50 @@ public Query rangeQuery(
356358 }
357359 u = HalfFloatPoint .nextDown (u );
358360 }
359- if ( isSearchable && hasDocValues ) {
360- Query query = HalfFloatPoint . newRangeQuery ( field , l , u );
361- Query dvQuery = SortedNumericDocValuesField .newSlowRangeQuery (
361+
362+ Query dvQuery = hasDocValues
363+ ? SortedNumericDocValuesField .newSlowRangeQuery (
362364 field ,
363365 HalfFloatPoint .halfFloatToSortableShort (l ),
364366 HalfFloatPoint .halfFloatToSortableShort (u )
367+ )
368+ : null ;
369+ if (isSearchable ) {
370+ Query pointRangeQuery = HalfFloatPoint .newRangeQuery (field , l , u );
371+ Query query ;
372+ if (dvQuery != null ) {
373+ query = new IndexOrDocValuesQuery (pointRangeQuery , dvQuery );
374+ if (context .indexSortedOnField (field )) {
375+ query = new IndexSortSortedNumericDocValuesRangeQuery (
376+ field ,
377+ HalfFloatPoint .halfFloatToSortableShort (l ),
378+ HalfFloatPoint .halfFloatToSortableShort (u ),
379+ query
380+ );
381+ }
382+ } else {
383+ query = pointRangeQuery ;
384+ }
385+ return new ApproximateScoreQuery (
386+ query ,
387+ new ApproximatePointRangeQuery (
388+ field ,
389+ NumberType .HALF_FLOAT .encodePoint (l ),
390+ NumberType .HALF_FLOAT .encodePoint (u ),
391+ APPROX_QUERY_NUMERIC_DIMS ,
392+ ApproximatePointRangeQuery .HALF_FLOAT_FORMAT
393+ )
365394 );
366- return new IndexOrDocValuesQuery (query , dvQuery );
367395 }
368- if (hasDocValues ) {
369- return SortedNumericDocValuesField . newSlowRangeQuery (
396+ if (context . indexSortedOnField ( field ) ) {
397+ dvQuery = new IndexSortSortedNumericDocValuesRangeQuery (
370398 field ,
371399 HalfFloatPoint .halfFloatToSortableShort (l ),
372- HalfFloatPoint .halfFloatToSortableShort (u )
400+ HalfFloatPoint .halfFloatToSortableShort (u ),
401+ dvQuery
373402 );
374403 }
375- return HalfFloatPoint . newRangeQuery ( field , l , u ) ;
404+ return dvQuery ;
376405 }
377406
378407 @ Override
@@ -503,23 +532,52 @@ public Query rangeQuery(
503532 u = FloatPoint .nextDown (u );
504533 }
505534 }
506- if ( isSearchable && hasDocValues ) {
507- Query query = FloatPoint . newRangeQuery ( field , l , u );
508- Query dvQuery = SortedNumericDocValuesField .newSlowRangeQuery (
535+
536+ Query dvQuery = hasDocValues
537+ ? SortedNumericDocValuesField .newSlowRangeQuery (
509538 field ,
510539 NumericUtils .floatToSortableInt (l ),
511540 NumericUtils .floatToSortableInt (u )
541+ )
542+ : null ;
543+
544+ if (isSearchable ) {
545+ Query pointRangeQuery = FloatPoint .newRangeQuery (field , l , u );
546+ Query query ;
547+ if (dvQuery != null ) {
548+ query = new IndexOrDocValuesQuery (pointRangeQuery , dvQuery );
549+ if (context .indexSortedOnField (field )) {
550+ query = new IndexSortSortedNumericDocValuesRangeQuery (
551+ field ,
552+ NumericUtils .floatToSortableInt (l ),
553+ NumericUtils .floatToSortableInt (u ),
554+ query
555+ );
556+ }
557+ } else {
558+ query = pointRangeQuery ;
559+ }
560+ return new ApproximateScoreQuery (
561+ query ,
562+ new ApproximatePointRangeQuery (
563+ field ,
564+ FloatPoint .pack (new float [] { l }).bytes ,
565+ FloatPoint .pack (new float [] { u }).bytes ,
566+ APPROX_QUERY_NUMERIC_DIMS ,
567+ ApproximatePointRangeQuery .FLOAT_FORMAT
568+ )
512569 );
513- return new IndexOrDocValuesQuery (query , dvQuery );
514570 }
515- if (hasDocValues ) {
516- return SortedNumericDocValuesField .newSlowRangeQuery (
571+
572+ if (context .indexSortedOnField (field )) {
573+ dvQuery = new IndexSortSortedNumericDocValuesRangeQuery (
517574 field ,
518575 NumericUtils .floatToSortableInt (l ),
519- NumericUtils .floatToSortableInt (u )
576+ NumericUtils .floatToSortableInt (u ),
577+ dvQuery
520578 );
521579 }
522- return FloatPoint . newRangeQuery ( field , l , u ) ;
580+ return dvQuery ;
523581 }
524582
525583 @ Override
@@ -628,23 +686,49 @@ public Query rangeQuery(
628686 QueryShardContext context
629687 ) {
630688 return doubleRangeQuery (lowerTerm , upperTerm , includeLower , includeUpper , (l , u ) -> {
631- if (isSearchable && hasDocValues ) {
632- Query query = DoublePoint .newRangeQuery (field , l , u );
633- Query dvQuery = SortedNumericDocValuesField .newSlowRangeQuery (
689+ Query dvQuery = hasDocValues
690+ ? SortedNumericDocValuesField .newSlowRangeQuery (
634691 field ,
635692 NumericUtils .doubleToSortableLong (l ),
636693 NumericUtils .doubleToSortableLong (u )
694+ )
695+ : null ;
696+ if (isSearchable ) {
697+ Query pointRangeQuery = DoublePoint .newRangeQuery (field , l , u );
698+ Query query ;
699+ if (dvQuery != null ) {
700+ query = new IndexOrDocValuesQuery (pointRangeQuery , dvQuery );
701+ if (context .indexSortedOnField (field )) {
702+ query = new IndexSortSortedNumericDocValuesRangeQuery (
703+ field ,
704+ NumericUtils .doubleToSortableLong (l ),
705+ NumericUtils .doubleToSortableLong (u ),
706+ query
707+ );
708+ }
709+ } else {
710+ query = pointRangeQuery ;
711+ }
712+ return new ApproximateScoreQuery (
713+ query ,
714+ new ApproximatePointRangeQuery (
715+ field ,
716+ DoublePoint .pack (new double [] { l }).bytes ,
717+ DoublePoint .pack (new double [] { u }).bytes ,
718+ APPROX_QUERY_NUMERIC_DIMS ,
719+ ApproximatePointRangeQuery .DOUBLE_FORMAT
720+ )
637721 );
638- return new IndexOrDocValuesQuery (query , dvQuery );
639722 }
640- if (hasDocValues ) {
641- return SortedNumericDocValuesField . newSlowRangeQuery (
723+ if (context . indexSortedOnField ( field ) ) {
724+ dvQuery = new IndexSortSortedNumericDocValuesRangeQuery (
642725 field ,
643726 NumericUtils .doubleToSortableLong (l ),
644- NumericUtils .doubleToSortableLong (u )
727+ NumericUtils .doubleToSortableLong (u ),
728+ dvQuery
645729 );
646730 }
647- return DoublePoint . newRangeQuery ( field , l , u ) ;
731+ return dvQuery ;
648732 });
649733 }
650734
@@ -988,23 +1072,33 @@ public Query rangeQuery(
9881072 --u ;
9891073 }
9901074 }
991- if (isSearchable && hasDocValues ) {
992- Query query = IntPoint .newRangeQuery (field , l , u );
993- Query dvQuery = SortedNumericDocValuesField .newSlowRangeQuery (field , l , u );
994- query = new IndexOrDocValuesQuery (query , dvQuery );
995- if (context .indexSortedOnField (field )) {
996- query = new IndexSortSortedNumericDocValuesRangeQuery (field , l , u , query );
1075+ Query dvQuery = hasDocValues ? SortedNumericDocValuesField .newSlowRangeQuery (field , l , u ) : null ;
1076+ if (isSearchable ) {
1077+ Query pointRangeQuery = IntPoint .newRangeQuery (field , l , u );
1078+ Query query ;
1079+ if (dvQuery != null ) {
1080+ query = new IndexOrDocValuesQuery (pointRangeQuery , dvQuery );
1081+ if (context .indexSortedOnField (field )) {
1082+ query = new IndexSortSortedNumericDocValuesRangeQuery (field , l , u , query );
1083+ }
1084+ } else {
1085+ query = pointRangeQuery ;
9971086 }
998- return query ;
1087+ return new ApproximateScoreQuery (
1088+ query ,
1089+ new ApproximatePointRangeQuery (
1090+ field ,
1091+ IntPoint .pack (new int [] { l }).bytes ,
1092+ IntPoint .pack (new int [] { u }).bytes ,
1093+ APPROX_QUERY_NUMERIC_DIMS ,
1094+ ApproximatePointRangeQuery .INT_FORMAT
1095+ )
1096+ );
9991097 }
1000- if (hasDocValues ) {
1001- Query query = SortedNumericDocValuesField .newSlowRangeQuery (field , l , u );
1002- if (context .indexSortedOnField (field )) {
1003- query = new IndexSortSortedNumericDocValuesRangeQuery (field , l , u , query );
1004- }
1005- return query ;
1098+ if (context .indexSortedOnField (field )) {
1099+ dvQuery = new IndexSortSortedNumericDocValuesRangeQuery (field , l , u , dvQuery );
10061100 }
1007- return IntPoint . newRangeQuery ( field , l , u ) ;
1101+ return dvQuery ;
10081102 }
10091103
10101104 @ Override
@@ -1136,11 +1230,10 @@ public Query rangeQuery(
11361230 field ,
11371231 LongPoint .pack (new long [] { l }).bytes ,
11381232 LongPoint .pack (new long [] { u }).bytes ,
1139- new long [] { l }. length ,
1233+ APPROX_QUERY_NUMERIC_DIMS ,
11401234 ApproximatePointRangeQuery .LONG_FORMAT
11411235 )
11421236 );
1143-
11441237 }
11451238 if (context .indexSortedOnField (field )) {
11461239 dvQuery = new IndexSortSortedNumericDocValuesRangeQuery (field , l , u , dvQuery );
@@ -1257,10 +1350,22 @@ public Query rangeQuery(
12571350 QueryShardContext context
12581351 ) {
12591352 return unsignedLongRangeQuery (lowerTerm , upperTerm , includeLower , includeUpper , (l , u ) -> {
1260- if (isSearchable && hasDocValues ) {
1353+ if (isSearchable ) {
12611354 Query query = BigIntegerPoint .newRangeQuery (field , l , u );
1262- Query dvQuery = SortedUnsignedLongDocValuesRangeQuery .newSlowRangeQuery (field , l , u );
1263- return new IndexOrDocValuesQuery (query , dvQuery );
1355+ if (hasDocValues ) {
1356+ Query dvQuery = SortedUnsignedLongDocValuesRangeQuery .newSlowRangeQuery (field , l , u );
1357+ query = new IndexOrDocValuesQuery (query , dvQuery );
1358+ }
1359+ return new ApproximateScoreQuery (
1360+ query ,
1361+ new ApproximatePointRangeQuery (
1362+ field ,
1363+ NumberType .UNSIGNED_LONG .encodePoint (l ),
1364+ NumberType .UNSIGNED_LONG .encodePoint (u ),
1365+ APPROX_QUERY_NUMERIC_DIMS ,
1366+ ApproximatePointRangeQuery .UNSIGNED_LONG_FORMAT
1367+ )
1368+ );
12641369 }
12651370 if (hasDocValues ) {
12661371 return SortedUnsignedLongDocValuesRangeQuery .newSlowRangeQuery (field , l , u );
0 commit comments