Index: lucene/contrib/CHANGES.txt
===================================================================
--- lucene/contrib/CHANGES.txt	(revision 928848)
+++ lucene/contrib/CHANGES.txt	(working copy)
@@ -57,6 +57,9 @@
 
  * LUCENE-2277: QueryNodeImpl threw ConcurrentModificationException on 
    add(List<QueryNode>). (Frank Wesemann via Robert Muir)
+
+ * LUCENE-2184: Fixed bug with handling best fit value when the proper best fit value is
+		not an indexed field.  Note, this change affects the APIs. (Grant Ingersoll)
    
 API Changes
 
Index: lucene/contrib/spatial/src/test/org/apache/lucene/spatial/tier/TestCartesian.java
===================================================================
--- lucene/contrib/spatial/src/test/org/apache/lucene/spatial/tier/TestCartesian.java	(revision 928848)
+++ lucene/contrib/spatial/src/test/org/apache/lucene/spatial/tier/TestCartesian.java	(working copy)
@@ -175,7 +175,7 @@
     if (VERBOSE) System.out.println("testAntiM");
     // create a distance query
     final DistanceQueryBuilder dq = new DistanceQueryBuilder(lat, lng, miles,
-        latField, lngField, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true);
+        latField, lngField, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true, 2, 15);
 
     if (VERBOSE) System.out.println(dq);
     //create a term query to search against all documents
@@ -270,7 +270,7 @@
 
     // create a distance query
     final DistanceQueryBuilder dq = new DistanceQueryBuilder(lat, lng, miles,
-        latField, lngField, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true);
+        latField, lngField, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true, 2, 15);
 
     if (VERBOSE) System.out.println(dq);
     //create a term query to search against all documents
@@ -367,7 +367,7 @@
     
       // create a distance query
       final DistanceQueryBuilder dq = new DistanceQueryBuilder(lat, lng, miles, 
-                                                               latField, lngField, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true);
+                                                               latField, lngField, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true, 2, 15);
      
       if (VERBOSE) System.out.println(dq);
       //create a term query to search against all documents
@@ -462,7 +462,7 @@
 	    
       // create a distance query
       final DistanceQueryBuilder dq = new DistanceQueryBuilder(lat, lng, miles, 
-                                                               geoHashPrefix, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true);
+                                                               geoHashPrefix, CartesianTierPlotter.DEFALT_FIELD_PREFIX, true, 2, 15);
 	     
       if (VERBOSE) System.out.println(dq);
       //create a term query to search against all documents
Index: lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceQueryBuilder.java
===================================================================
--- lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceQueryBuilder.java	(revision 928848)
+++ lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/DistanceQueryBuilder.java	(working copy)
@@ -47,15 +47,17 @@
    * @param lat
    * @param lng
    * @param miles
+   * @param minTierIndexed The minimum tier level indexed
+   * @param maxTierIndexed The maximum tier level indexed
    */
   public DistanceQueryBuilder (double lat, double lng, double miles, 
-      String latField, String lngField, String tierFieldPrefix, boolean needPrecise) {
+      String latField, String lngField, String tierFieldPrefix, boolean needPrecise, int minTierIndexed, int maxTierIndexed) {
 
     this.lat = lat;
     this.lng = lng;
     this.miles = miles;
     
-    CartesianPolyFilterBuilder cpf = new CartesianPolyFilterBuilder(tierFieldPrefix);
+    CartesianPolyFilterBuilder cpf = new CartesianPolyFilterBuilder(tierFieldPrefix, minTierIndexed, maxTierIndexed);
     Filter cartesianFilter = cpf.getBoundingArea(lat, lng, miles);
 
     /* create precise distance filter */
@@ -77,13 +79,13 @@
    * @param miles
    */
   public DistanceQueryBuilder (double lat, double lng, double miles, 
-      String geoHashFieldPrefix, String tierFieldPrefix, boolean needPrecise){
+      String geoHashFieldPrefix, String tierFieldPrefix, boolean needPrecise,  int minTierIndexed, int maxTierIndexed){
 
     this.lat = lat;
     this.lng = lng;
     this.miles = miles;
     
-    CartesianPolyFilterBuilder cpf = new CartesianPolyFilterBuilder(tierFieldPrefix);
+    CartesianPolyFilterBuilder cpf = new CartesianPolyFilterBuilder(tierFieldPrefix, minTierIndexed, maxTierIndexed);
     Filter cartesianFilter = cpf.getBoundingArea(lat, lng, miles);
 
     /* create precise distance filter */
Index: lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/CartesianPolyFilterBuilder.java
===================================================================
--- lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/CartesianPolyFilterBuilder.java	(revision 928848)
+++ lucene/contrib/spatial/src/java/org/apache/lucene/spatial/tier/CartesianPolyFilterBuilder.java	(working copy)
@@ -44,9 +44,18 @@
 
   private IProjector projector = new SinusoidalProjector();
   private final String tierPrefix;
-  
-  public CartesianPolyFilterBuilder( String tierPrefix ) {
+	private int minTier;
+	private int maxTier;
+  /**
+   * 
+   * @param tierPrefix The prefix for the name of the fields containing the tier info
+   * @param minTierIndexed The minimum tier level indexed
+   * @param maxTierIndexed The maximum tier level indexed
+   */
+  public CartesianPolyFilterBuilder( String tierPrefix, int minTierIndexed, int maxTierIndexed ) {
     this.tierPrefix = tierPrefix;
+	this.minTier = minTierIndexed;
+	this.maxTier = maxTierIndexed;
   }
   
   public Shape getBoxShape(double latitude, double longitude, double miles)
@@ -77,6 +86,11 @@
     //System.err.println("getBoxShape:"+latX+"," + longX);
     CartesianTierPlotter ctp = new CartesianTierPlotter(2, projector,tierPrefix);
     int bestFit = ctp.bestFit(miles);
+	if (bestFit < minTier){
+		bestFit = minTier;
+	} else if (bestFit > maxTier){
+		bestFit = maxTier;
+	}
     
     ctp = new CartesianTierPlotter(bestFit, projector,tierPrefix);
     Shape shape = new Shape(ctp.getTierFieldName());
