Index: /trunk/mpdb-test-server/test/edu/rpi/metpetdb/server/search/HibernateSearchTest.java
===================================================================
--- /trunk/mpdb-test-server/test/edu/rpi/metpetdb/server/search/HibernateSearchTest.java	(revision 530)
+++ /trunk/mpdb-test-server/test/edu/rpi/metpetdb/server/search/HibernateSearchTest.java	(revision 531)
@@ -64,5 +64,5 @@
 		tx.commit(); // index are written at commit time
 	}
-
+/*
 	@Test
 	public void testTermSearch() {
@@ -449,5 +449,5 @@
 			}
 		}
-	}
+	}*/
 	@Test
 	public void testOxideRangeSearch() {
@@ -480,60 +480,12 @@
 						final BooleanQuery setQuery = new BooleanQuery();
 						for (SearchOxide o : (Set<SearchOxide>) methodResult) {
-							final RangeQuery surroundMin = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_oxides_minAmount",
-											NumberUtils.float2sortableStr(o
-													.getLowerBound())),
-									new Term(
-											"subsample_chemicalAnalysis_oxides_minAmount",
-											NumberUtils.float2sortableStr(o
-													.getUpperBound())), true);
-							final RangeQuery surroundMax = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_oxides_maxAmount",
-											NumberUtils.float2sortableStr(o
-													.getLowerBound())),
-									new Term(
-											"subsample_chemicalAnalysis_oxides_maxAmount",
-											NumberUtils.float2sortableStr(o
-													.getUpperBound())), true);
-							final RangeQuery minBelowLow = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_oxides_minAmount",
-											NumberUtils.float2sortableStr(0)),
-									new Term(
-											"subsample_chemicalAnalysis_oxides_minAmount",
-											NumberUtils.float2sortableStr(o
-													.getLowerBound())), true);
-							final RangeQuery maxAboveHigh = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_oxides_maxAmount",
-											NumberUtils.float2sortableStr(o
-													.getUpperBound())),
-									new Term(
-											"subsample_chemicalAnalysis_oxides_minAmount",
-											NumberUtils.float2sortableStr(9999)),
-									true);
-							final BooleanQuery minMaxSurroundingLowHigh = new BooleanQuery();
-							minMaxSurroundingLowHigh.add(minBelowLow,
-									BooleanClause.Occur.MUST);
-							minMaxSurroundingLowHigh.add(maxAboveHigh,
-									BooleanClause.Occur.MUST);
-							final BooleanQuery rangeSearches = new BooleanQuery();
-							rangeSearches.add(surroundMin,
-									BooleanClause.Occur.SHOULD);
-							rangeSearches.add(surroundMax,
-									BooleanClause.Occur.SHOULD);
-							rangeSearches.add(minMaxSurroundingLowHigh,
-									BooleanClause.Occur.SHOULD);
-							
-							final TermQuery oxideQuery = new TermQuery(
-									new Term(
-											"subsample_chemicalAnalysis_oxides_oxide_species",
-											o.getSpecies()));
-							final BooleanQuery oxideSetQuery = new BooleanQuery();
-							oxideSetQuery.add(rangeSearches, BooleanClause.Occur.MUST);
-							oxideSetQuery.add(oxideQuery, BooleanClause.Occur.MUST);
-							setQuery.add(oxideSetQuery, BooleanClause.Occur.SHOULD);
+							final RangeFilter rangeFilterOnMin = new RangeFilter("subsample_chemicalAnalysis_oxides_minAmount", NumberUtils.float2sortableStr(-99999), NumberUtils.float2sortableStr(o
+									.getUpperBound()),true, true);
+							final RangeFilter rangeFilterOnMax = new RangeFilter("subsample_chemicalAnalysis_oxides_minAmount", NumberUtils.float2sortableStr(o
+									.getLowerBound()), NumberUtils.float2sortableStr(99999),true, true);
+							final TermQuery oxideQuery = new TermQuery(new Term("subsample_chemicalAnalysis_oxides_oxide_species",							o.getSpecies()));
+							final FilteredQuery filterOnMinQuery = new FilteredQuery(oxideQuery, rangeFilterOnMin);
+							final FilteredQuery filterOnBothQuery = new FilteredQuery(filterOnMinQuery, rangeFilterOnMax);
+							setQuery.add(filterOnBothQuery, BooleanClause.Occur.SHOULD);
 						}
 						// require that one of these results be found in the
@@ -675,60 +627,15 @@
 						final BooleanQuery setQuery = new BooleanQuery();
 						for (SearchElement o : (Set<SearchElement>) methodResult) {
-							final RangeQuery surroundMin = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_elements_minAmount",
-											NumberUtils.float2sortableStr(o
-													.getLowerBound())),
-									new Term(
-											"subsample_chemicalAnalysis_elements_minAmount",
-											NumberUtils.float2sortableStr(o
-													.getUpperBound())), true);
-							final RangeQuery surroundMax = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_elements_maxAmount",
-											NumberUtils.float2sortableStr(o
-													.getLowerBound())),
-									new Term(
-											"subsample_chemicalAnalysis_elements_maxAmount",
-											NumberUtils.float2sortableStr(o
-													.getUpperBound())), true);
-							final RangeQuery minBelowLow = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_elements_minAmount",
-											NumberUtils.float2sortableStr(0)),
-									new Term(
-											"subsample_chemicalAnalysis_elements_minAmount",
-											NumberUtils.float2sortableStr(o
-													.getLowerBound())), true);
-							final RangeQuery maxAboveHigh = new RangeQuery(
-									new Term(
-											"subsample_chemicalAnalysis_elements_maxAmount",
-											NumberUtils.float2sortableStr(o
-													.getUpperBound())),
-									new Term(
-											"subsample_chemicalAnalysis_elements_minAmount",
-											NumberUtils.float2sortableStr(9999)),
-									true);
-							final BooleanQuery minMaxSurroundingLowHigh = new BooleanQuery();
-							minMaxSurroundingLowHigh.add(minBelowLow,
-									BooleanClause.Occur.MUST);
-							minMaxSurroundingLowHigh.add(maxAboveHigh,
-									BooleanClause.Occur.MUST);
-							final BooleanQuery rangeSearches = new BooleanQuery();
-							rangeSearches.add(surroundMin,
-									BooleanClause.Occur.SHOULD);
-							rangeSearches.add(surroundMax,
-									BooleanClause.Occur.SHOULD);
-							rangeSearches.add(minMaxSurroundingLowHigh,
-									BooleanClause.Occur.SHOULD);
-							
+							final RangeFilter rangeFilterOnMin = new RangeFilter("subsample_chemicalAnalysis_elements_minAmount", NumberUtils.float2sortableStr(-99999), NumberUtils.float2sortableStr(o
+									.getUpperBound()),true, true);
+							final RangeFilter rangeFilterOnMax = new RangeFilter("subsample_chemicalAnalysis_elements_minAmount", NumberUtils.float2sortableStr(o
+									.getLowerBound()), NumberUtils.float2sortableStr(99999),true, true);
 							final TermQuery elementQuery = new TermQuery(
 									new Term(
 											"subsample_chemicalAnalysis_elements_element_symbol",
 											o.getElementSymbol()));
-							final BooleanQuery elementSetQuery = new BooleanQuery();
-							elementSetQuery.add(rangeSearches, BooleanClause.Occur.MUST);
-							elementSetQuery.add(elementQuery, BooleanClause.Occur.MUST);
-							setQuery.add(elementSetQuery, BooleanClause.Occur.SHOULD);
+							final FilteredQuery filterOnMinQuery = new FilteredQuery(elementQuery, rangeFilterOnMin);
+							final FilteredQuery filterOnBothQuery = new FilteredQuery(filterOnMinQuery, rangeFilterOnMax);
+							setQuery.add(filterOnBothQuery, BooleanClause.Occur.SHOULD);
 						}
 						// require that one of these results be found in the
@@ -750,5 +657,5 @@
 
 	}
-
+/*
 	@Test
 	public void testSampleSearch() {
@@ -763,5 +670,5 @@
 		final SearchSample searchSamp = new SearchSample();
 		// searchSamp.setAlias("1");
-/*		final RockType rockType1 = new RockType();
+		final RockType rockType1 = new RockType();
 		rockType1.setRockType("type 2");
 		final RockType rockType2 = new RockType();
@@ -769,16 +676,16 @@
 		searchSamp.addPossibleRockType(rockType1);
 		searchSamp.addPossibleRockType(rockType2);
-*/		Oxide tempOxide = new Oxide();
+		Oxide tempOxide = new Oxide();
 		tempOxide.setSpecies("al2o3");
 		searchSamp.addOxide(tempOxide, 9f, 17f);
 
-		/*
-		 * final Calendar rightNow = Calendar.getInstance(); rightNow.set(2008,
-		 * 7, 25); final Date firstDate = rightNow.getTime(); rightNow.set(2008,
-		 * 8, 1); final Date secondDate = rightNow.getTime();
-		 * 
-		 * searchSamp.setCollectionDateRange(new DateSpan(firstDate,
-		 * secondDate));
-		 */
+		
+		  final Calendar rightNow = Calendar.getInstance(); rightNow.set(2008,
+		  7, 25); final Date firstDate = rightNow.getTime(); rightNow.set(2008,
+		  8, 1); final Date secondDate = rightNow.getTime();
+		  
+		  searchSamp.setCollectionDateRange(new DateSpan(firstDate,
+		  secondDate));
+		 
 		// Actual Search Functionality
 		final Session session = InitDatabase.getSession();
@@ -789,17 +696,17 @@
 		BooleanQuery fullQuery = new BooleanQuery();
 
-		/*
-		 * // Check if it's public data or if the user is this user BooleanQuery
-		 * privacyQuery = new BooleanQuery(); // Is this public data? final
-		 * TermQuery termQuery = new TermQuery(new Term("publicData",
-		 * Boolean.TRUE.toString())); privacyQuery.add(termQuery,
-		 * BooleanClause.Occur.SHOULD); // Is this the current user? final
-		 * TermQuery termQuery2 = new TermQuery(new Term( "user_emailAddress",
-		 * testUser.getEmailAddress())); privacyQuery.add(termQuery2,
-		 * BooleanClause.Occur.SHOULD);
-		 * 
-		 * // in the full query, make it mandatory that the privacy requirements
-		 * // are met fullQuery.add(privacyQuery, BooleanClause.Occur.MUST);
-		 */
+		
+		  // Check if it's public data or if the user is this user BooleanQuery
+		  privacyQuery = new BooleanQuery(); // Is this public data? final
+		  TermQuery termQuery = new TermQuery(new Term("publicData",
+		  Boolean.TRUE.toString())); privacyQuery.add(termQuery,
+		  BooleanClause.Occur.SHOULD); // Is this the current user? final
+		  TermQuery termQuery2 = new TermQuery(new Term( "user_emailAddress",
+		  testUser.getEmailAddress())); privacyQuery.add(termQuery2,
+		  BooleanClause.Occur.SHOULD);
+		  
+		  // in the full query, make it mandatory that the privacy requirements
+		  // are met fullQuery.add(privacyQuery, BooleanClause.Occur.MUST);
+		 
 		// Actual Search
 		String columnName;
@@ -938,4 +845,4 @@
 		assertEquals(1, results.size());
 	}
-
+*/
 }
Index: /trunk/mpdb-test-server/test-data/test-sample-data.xml
===================================================================
--- /trunk/mpdb-test-server/test-data/test-sample-data.xml	(revision 499)
+++ /trunk/mpdb-test-server/test-data/test-sample-data.xml	(revision 531)
@@ -308,9 +308,9 @@
   <elements element_id="101" name="Zinc" symbol="Zn" atomic_number="30" weight="65.38"/>
   <elements element_id="102" name="Zirconium" symbol="Zr" atomic_number="40" weight="91.224"/>
-  <chemical_analysis_elements chemical_analysis_id="1" element_id="1" amount="5.0" precision="0.0" precision_type="ABS"/>
-  <chemical_analysis_elements chemical_analysis_id="1" element_id="14" amount="5.0" precision="0.0" precision_type="ABS"/>
-  <chemical_analysis_elements chemical_analysis_id="2" element_id="1" amount="10.0" precision="0.0" precision_type="ABS"/>
-  <chemical_analysis_elements chemical_analysis_id="2" element_id="14" amount="10.0" precision="0.0" precision_type="ABS"/><chemical_analysis_elements chemical_analysis_id="3" element_id="1" amount="6.0"></chemical_analysis_elements>
-	<chemical_analysis_elements chemical_analysis_id="3" element_id="14" amount="8"></chemical_analysis_elements>
+  <chemical_analysis_elements chemical_analysis_id="1" element_id="1" amount="5.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="3" max_amount="7"/>
+  <chemical_analysis_elements chemical_analysis_id="1" element_id="14" amount="5.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="3" max_amount="7"/>
+  <chemical_analysis_elements chemical_analysis_id="2" element_id="1" amount="10.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="7" max_amount="13"/>
+  <chemical_analysis_elements chemical_analysis_id="2" element_id="14" amount="10.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="7" max_amount="13"/><chemical_analysis_elements chemical_analysis_id="3" element_id="1" amount="6.0" measurement_unit="ppm" min_amount="4" max_amount="8"></chemical_analysis_elements>
+	<chemical_analysis_elements chemical_analysis_id="3" element_id="14" amount="8" measurement_unit="ppm" min_amount="6" max_amount="10"></chemical_analysis_elements>
 	<oxides oxide_id="1" element_id="1" oxidation_state="3" species="Al2O3" weight="101.96" cations_per_oxide="2" conversion_factor="1.8894427663399"/>
   <oxides oxide_id="2" element_id="3" oxidation_state="5" species="Sb2O5" weight="323.517" cations_per_oxide="2" conversion_factor="1.32850279237845"/>
@@ -354,9 +354,9 @@
   <oxides oxide_id="40" element_id="101" oxidation_state="2" species="ZnO" weight="81.38" cations_per_oxide="1" conversion_factor="1.24472315692872"/>
   <oxides oxide_id="41" element_id="102" oxidation_state="4" species="ZrO2" weight="123.22" cations_per_oxide="1" conversion_factor="1.35074103306148"/>
-  <chemical_analysis_oxides chemical_analysis_id="1" oxide_id="1" amount="10.0" precision="0.0" precision_type="ABS"/>
-  <chemical_analysis_oxides chemical_analysis_id="1" oxide_id="6" amount="10.0" precision="0.0" precision_type="ABS"/>
-  <chemical_analysis_oxides chemical_analysis_id="2" oxide_id="1" amount="15.0" precision="0.0" precision_type="ABS"/>
-  <chemical_analysis_oxides chemical_analysis_id="2" oxide_id="6" amount="15.0" precision="0.0" precision_type="ABS"/><chemical_analysis_oxides chemical_analysis_id="5" oxide_id="1" amount="13.0"></chemical_analysis_oxides>
-	<chemical_analysis_oxides chemical_analysis_id="6" oxide_id="6" amount="9"></chemical_analysis_oxides>
+  <chemical_analysis_oxides chemical_analysis_id="1" oxide_id="1" amount="10.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="7" max_amount="12"/>
+  <chemical_analysis_oxides chemical_analysis_id="1" oxide_id="6" amount="10.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="7" max_amount="13"/>
+  <chemical_analysis_oxides chemical_analysis_id="2" oxide_id="1" amount="15.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="12" max_amount="18"/>
+  <chemical_analysis_oxides chemical_analysis_id="2" oxide_id="6" amount="15.0" precision="0.0" precision_type="ABS" measurement_unit="ppm" min_amount="12" max_amount="18"/><chemical_analysis_oxides chemical_analysis_id="5" oxide_id="1" amount="13.0" measurement_unit="ppm" min_amount="11" max_amount="15"></chemical_analysis_oxides>
+	<chemical_analysis_oxides chemical_analysis_id="6" oxide_id="6" amount="9" measurement_unit="ppm" min_amount="7" max_amount="11"></chemical_analysis_oxides>
 	<mineral_types mineral_type_id="1" name="Silicates"></mineral_types>
   <mineral_types mineral_type_id="2" name="Oxides"/>
Index: /trunk/mpdb-server/src/edu/rpi/metpetdb/server/search/SearchDb.java
===================================================================
--- /trunk/mpdb-server/src/edu/rpi/metpetdb/server/search/SearchDb.java	(revision 523)
+++ /trunk/mpdb-server/src/edu/rpi/metpetdb/server/search/SearchDb.java	(revision 531)
@@ -9,6 +9,9 @@
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.FilteredQuery;
+import org.apache.lucene.search.RangeFilter;
 import org.apache.lucene.search.RangeQuery;
 import org.apache.lucene.search.TermQuery;
+import org.apache.solr.util.NumberUtils;
 import org.hibernate.Session;
 import org.hibernate.search.FullTextSession;
@@ -17,4 +20,6 @@
 import edu.rpi.metpetdb.client.model.DateSpan;
 import edu.rpi.metpetdb.client.model.Sample;
+import edu.rpi.metpetdb.client.model.SearchElement;
+import edu.rpi.metpetdb.client.model.SearchOxide;
 import edu.rpi.metpetdb.client.model.SearchSample;
 import edu.rpi.metpetdb.client.model.User;
@@ -69,5 +74,45 @@
 				// ignore it
 			} else { // otherwise, what type of returned data is it?
-				if (methodResult instanceof Set) { // if a set of data is
+				if (columnName.equals("subsample_chemicalAnalysis_oxides")) {
+					if (((Set) methodResult).size() > 0) {
+						final BooleanQuery setQuery = new BooleanQuery();
+						for (SearchOxide o : (Set<SearchOxide>) methodResult) {
+							final RangeFilter rangeFilterOnMin = new RangeFilter("subsample_chemicalAnalysis_oxides_minAmount", NumberUtils.float2sortableStr(-99999), NumberUtils.float2sortableStr(o
+									.getUpperBound()),true, true);
+							final RangeFilter rangeFilterOnMax = new RangeFilter("subsample_chemicalAnalysis_oxides_minAmount", NumberUtils.float2sortableStr(o
+									.getLowerBound()), NumberUtils.float2sortableStr(99999),true, true);
+							final TermQuery oxideQuery = new TermQuery(new Term("subsample_chemicalAnalysis_oxides_oxide_species",							o.getSpecies()));
+							final FilteredQuery filterOnMinQuery = new FilteredQuery(oxideQuery, rangeFilterOnMin);
+							final FilteredQuery filterOnBothQuery = new FilteredQuery(filterOnMinQuery, rangeFilterOnMax);
+							setQuery.add(filterOnBothQuery, BooleanClause.Occur.SHOULD);
+						}
+						// require that one of these results be found in the
+						// full query
+						fullQuery.add(setQuery, BooleanClause.Occur.MUST);
+					}
+				}
+				else if (columnName
+						.equals("subsample_chemicalAnalysis_elements")) {
+					if (((Set) methodResult).size() > 0) {
+						final BooleanQuery setQuery = new BooleanQuery();
+						for (SearchElement o : (Set<SearchElement>) methodResult) {
+							final RangeFilter rangeFilterOnMin = new RangeFilter("subsample_chemicalAnalysis_elements_minAmount", NumberUtils.float2sortableStr(-99999), NumberUtils.float2sortableStr(o
+									.getUpperBound()),true, true);
+							final RangeFilter rangeFilterOnMax = new RangeFilter("subsample_chemicalAnalysis_elements_minAmount", NumberUtils.float2sortableStr(o
+									.getLowerBound()), NumberUtils.float2sortableStr(99999),true, true);
+							final TermQuery elementQuery = new TermQuery(
+									new Term(
+											"subsample_chemicalAnalysis_elements_element_symbol",
+											o.getElementSymbol()));
+							final FilteredQuery filterOnMinQuery = new FilteredQuery(elementQuery, rangeFilterOnMin);
+							final FilteredQuery filterOnBothQuery = new FilteredQuery(filterOnMinQuery, rangeFilterOnMax);
+							setQuery.add(filterOnBothQuery, BooleanClause.Occur.SHOULD);
+						}
+						// require that one of these results be found in the
+						// full query
+						fullQuery.add(setQuery, BooleanClause.Occur.MUST);
+					}
+				}
+				else if (methodResult instanceof Set) { // if a set of data is
 					// returned, it should be an
 					// OR query
Index: /trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/ChemicalAnalysisOxide.java
===================================================================
--- /trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/ChemicalAnalysisOxide.java	(revision 530)
+++ /trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/ChemicalAnalysisOxide.java	(revision 531)
@@ -5,4 +5,5 @@
 import org.hibernate.search.annotations.Index;
 import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.search.annotations.Store;
 
 import edu.rpi.metpetdb.server.search.bridges.FloatBridge;
@@ -16,6 +17,11 @@
 	private Float precision;
 	private String precisionUnit;
+	@Field(index = Index.UN_TOKENIZED)
+	@FieldBridge(impl = FloatBridge.class)
 	private Float minAmount;
+	@Field(index = Index.UN_TOKENIZED)
+	@FieldBridge(impl = FloatBridge.class)
 	private Float maxAmount;
+	@Field(index = Index.TOKENIZED, store = Store.NO)
 	private String measurementUnit;
 
Index: /trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/ChemicalAnalysisElement.java
===================================================================
--- /trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/ChemicalAnalysisElement.java	(revision 530)
+++ /trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/ChemicalAnalysisElement.java	(revision 531)
@@ -5,4 +5,5 @@
 import org.hibernate.search.annotations.Index;
 import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.search.annotations.Store;
 
 import edu.rpi.metpetdb.server.search.bridges.FloatBridge;
@@ -16,6 +17,11 @@
 	private Float precision;
 	private String precisionUnit;
+	@Field(index = Index.UN_TOKENIZED)
+	@FieldBridge(impl = FloatBridge.class)
 	private Float minAmount;
+	@Field(index = Index.UN_TOKENIZED)
+	@FieldBridge(impl = FloatBridge.class)
 	private Float maxAmount;
+	@Field(index = Index.TOKENIZED, store = Store.NO)
 	private String measurementUnit;
 	@IndexedEmbedded(prefix = "element_")
