for (String facetField : facetFields) { FacetingRequest facetingRequest = queryBuilder.facet().name(facetField + FACET_NAME_SUFFIX).onField(facetField) .discrete().orderedBy(FacetSortOrder.COUNT_DESC).includeZeroCounts(false).maxFacetCount(facetCount) .createFacetingRequest(); facetManager.enableFaceting(facetingRequest);
private void buildFullTextQuery(String queryString, FullTextSession fullTextSession) { // get a query builder final QueryBuilder builder = fullTextSession.getSearchFactory() .buildQueryBuilder() .forEntity( Car.class ) .get(); // build a Lucene query final Query query = builder.keyword().onField( "make" ).matching( queryString ).createQuery(); // create facets for navigation // discrete faceting final FacetingRequest colorFacet = builder.facet() .name( colorFacetName ) .onField( "color" ) .discrete() .createFacetingRequest(); // range faceting final FacetingRequest priceFacet = builder.facet() .name( cubicCapacityFacetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_NUMERIC_ENCODING ) .range() .below( 2500 ).excludeLimit() .from( 2500 ).to( 3000 ) .above( 3000 ).excludeLimit() .createFacetingRequest(); // create the fulltext query, enable the facets via the facet manager and return the results currentFullTextQuery = fullTextSession.createFullTextQuery( query, Car.class ); currentFullTextQuery.setFirstResult( 0 ).setMaxResults( 20 ); currentFullTextQuery.getFacetManager().enableFaceting( colorFacet ).enableFaceting( priceFacet ); }
@Test public void testRangeQueryWithUnsupportedType() { try { queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( new Object() ).to( new Object() ) .createFacetingRequest(); fail( "Unsupported range faceting type" ); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000269" ) ); } }
@Test public void testDateRangeFaceting() throws Exception { final String facetingName = "albumYearFaceting"; final String fieldName = "releaseYear"; final DateFormat formatter = new SimpleDateFormat( "yyyy", Locale.ROOT ); FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( facetingName ) .onField( fieldName ) .range() .below( formatter.parse( "1970" ) ).excludeLimit() .from( formatter.parse( "1970" ) ).to( formatter.parse( "1979" ) ) .from( formatter.parse( "1980" ) ).to( formatter.parse( "1989" ) ) .from( formatter.parse( "1990" ) ).to( formatter.parse( "1999" ) ) .above( formatter.parse( "2000" ) ).excludeLimit() .orderedBy( FacetSortOrder.RANGE_DEFINITION_ORDER ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( facetingName ); assertFacetCounts( facets, new int[] { 1, 2, 2, 5 } ); facetManager.getFacetGroup( facetingName ).selectFacets( facets.get( 3 ) ); facets = facetManager.getFacets( facetingName ); assertFacetCounts( facets, new int[] { 5 } ); }
for (String facetField : facetFields) { FacetingRequest facetingRequest = queryBuilder.facet().name(facetField + FACET_NAME_SUFFIX).onField(facetField) .discrete().orderedBy(FacetSortOrder.COUNT_DESC).includeZeroCounts(false).maxFacetCount(facetCount) .createFacetingRequest(); facetManager.enableFaceting(facetingRequest);
@Test public void testRangeQueryWithNullToAndFrom() { try { queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( null ).to( null ) .createFacetingRequest(); fail( "Unsupported range faceting type" ); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000270" ) ); } }
@Test public void testSimpleFaceting() throws Exception { String facetName = "ccs"; FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .createFacetingRequest(); FullTextQuery query = matchAll( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertEquals( "Wrong number of facets", 4, facetList.size() ); assertFacet( facetList.get( 0 ), "2407", 17 ); assertFacet( facetList.get( 1 ), "2831", 16 ); assertFacet( facetList.get( 2 ), "3398", 16 ); assertFacet( facetList.get( 3 ), "2500", 1 ); }
@Test public void testRangeAboveExcludeLimit() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .above( 1500 ).excludeLimit() .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5 } ); }
@Test public void testAlphabeticalSortOrder() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .orderedBy( FacetSortOrder.FIELD_VALUE ) .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); for ( int i = 1; i < facetList.size() - 1; i++ ) { String previousFacetValue = facetList.get( i - 1 ).getValue(); String currentFacetValue = facetList.get( i ).getValue(); assertTrue( "Wrong alphabetical sort order", previousFacetValue.compareTo( currentFacetValue ) < 0 ); } }
@Test public void testRangeAbove() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .above( 1500 ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 8 } ); }
@Test @TestForIssue(jiraKey = "HSEARCH-809") public void testStringFaceting() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( "manufacturer" ) .onField( "make" ) .discrete() .includeZeroCounts( false ) .createFacetingRequest(); FullTextQuery query = matchAll( request ); List<Facet> facetList = query.getFacetManager().getFacets( "manufacturer" ); assertEquals( "Wrong number of facets", 5, facetList.size() ); assertFacet( facetList.get( 0 ), "Honda", 13 ); assertFacet( facetList.get( 1 ), "BMW", 12 ); assertFacet( facetList.get( 2 ), "Mercedes", 12 ); assertFacet( facetList.get( 3 ), "Toyota", 12 ); assertFacet( facetList.get( 4 ), "Ford", 1 ); }
@Test public void testRangeBelow() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .below( 1500 ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5 } ); }
@Test public void testAllIndexedManyToOneValuesGetCounted() throws Exception { FacetingRequest request = queryBuilder( Company.class ).facet() .name( facetName ) .onField( indexFieldName ) .discrete() .includeZeroCounts( true ) .createFacetingRequest(); FullTextQuery query = queryCompanyWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertEquals( "Wrong number of facets", 2, facetList.size() ); // check count in facet Iterator<Facet> itr = facetList.iterator(); while ( itr.hasNext() ) { Facet item = itr.next(); assertEquals( "Wrong count of facet", 1, item.getCount() ); } }
@Test public void testRangeBelowExcludeLimit() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .below( 1500 ).excludeLimit() .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 2 } ); }
@Test public void testSimpleDiscretFacetingQuery() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertEquals( "Wrong number of facets", 3, facetList.size() ); }
@Test public void testUnsupportedRangeParameterTypeThrowsException() { FacetingRequest rangeRequest = queryBuilder( Fruit.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( "0.00" ).to( "1.00" ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Fruit.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); try { query.getFacetManager().getFacets( priceRange ); fail( "Trying to so a range query using string as parameter should fail." ); } catch (SearchException e) { assertTrue( "Unexpected error message: " + e.getMessage(), e.getMessage().startsWith( "HSEARCH000266" ) ); } }
@Test public void testFacetingOnEmptyIndex() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .createFacetingRequest(); FullTextQuery query = queryHondaWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertEquals( "Wrong number of facets", 0, facetList.size() ); }
@Test public void testRangeQueryForDoubleWithoutZeroCount() { FacetingRequest rangeRequest = queryBuilder( Fruit.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .from( 0.00 ).to( 1.00 ) .from( 1.01 ).to( 1.50 ) .from( 1.51 ).to( 3.00 ) .from( 4.00 ).to( 5.00 ) .includeZeroCounts( false ) .orderedBy( FacetSortOrder.COUNT_ASC ) .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Fruit.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = query.getFacetManager().getFacets( priceRange ); assertFacetCounts( facets, new int[] { 2, 3, 5 } ); assertEquals( "[0.0, 1.0]", facets.get( 0 ).getValue() ); assertEquals( "[1.01, 1.5]", facets.get( 1 ).getValue() ); assertEquals( "[1.51, 3.0]", facets.get( 2 ).getValue() ); }
@Test public void testSimpleDiscretFacetingWithNoResultsQuery() throws Exception { FacetingRequest request = queryBuilder( Car.class ).facet() .name( facetName ) .onField( Car.CUBIC_CAPACITY_STRING_FACET_STRING_ENCODING ) .discrete() .createFacetingRequest(); FullTextQuery query = queryHondaNoResultsWithFacet( request ); List<Facet> facetList = query.getFacetManager().getFacets( facetName ); assertEquals( "Wrong number of facets", 0, facetList.size() ); }
@Test public void testRangeAboveBelow() { FacetingRequest rangeRequest = queryBuilder( Cd.class ).facet() .name( priceRange ) .onField( indexFieldName ) .range() .below( 1500 ) .above( 1500 ).excludeLimit() .createFacetingRequest(); FullTextQuery query = createMatchAllQuery( Cd.class ); FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( rangeRequest ); List<Facet> facets = facetManager.getFacets( priceRange ); assertFacetCounts( facets, new int[] { 5, 5 } ); }