[hibernate-dev] [HSearch] Facet drilldown

Sanne Grinovero sanne at hibernate.org
Sun Mar 13 21:01:34 EDT 2011


Hi Hardy,
the filtering idea is looking great.
I'm wondering how this affects performance, but I guess we can focus
on API and feature for now.

I'm a bit concerned on the result type of a faceting query, it seems
that even your own tests need a three-liner helper method to get to
the value you actually need.
What about trying to improve that, like from the current form:
List<Facet> facetList = query.getFacetResults().get( facetName ).getFacets();
shorter:
List<Facet> facetList = query.getFacets( facetName );
WDYT?

This way nor getFieldName() nor getName() from FacetResult would be
available, but you're never ever invoking them from any test, so I'm
wondering if they are actually useful: I'd expect the user of
getFacets to know which field he is querying.

In FacetBuildingContext, FacetFilter, FacetRequest, Facet you're using
a StringBuffer instead of a StringBuilder, using some "vintage"
toString generator ?
https://github.com/hferentschik/hibernate-search/pull/1

Cheers,
Sanne


2011/3/11 Hardy Ferentschik <hibernate at ferentschik.de>:
> Hi,
>
> sorry for the following lengthy code example, but it is hard to
> demonstrate this much shorter.
> The example shows how you can enable multiple facets and then continuously
> restrict the query result
> by chaining facets into a FacetFilter (which delegates to a ChainedFilter
> underneath). WDYT?
> If you want to see all the code or even get the feature branch -
> https://github.com/hferentschik/hibernate-search/blob/HSEARCH-706
>
>
>        public void testMultipleFacetDrillDown() throws Exception {
>                final String ccsFacetName = "ccs";
>                final String ccsFacetFieldName = "cubicCapacity";
>                FacetRequest ccsFacetRequest = queryBuilder( Car.class ).facet()
>                                .name( ccsFacetName )
>                                .onField( ccsFacetFieldName )
>                                .discrete()
>                                .createFacet();
>
>                final String colorFacetName = "color";
>                final String colorFacetFieldName = "color";
>                FacetRequest colorFacetRequest = queryBuilder( Car.class ).facet()
>                                .name( colorFacetName )
>                                .onField( colorFacetFieldName )
>                                .discrete()
>                                .createFacet();
>
>                FullTextQuery query = createMatchAllQuery( Car.class );
>                query.enableFacet( colorFacetRequest );
>                query.enableFacet( ccsFacetRequest );
>                assertEquals( "Wrong number of query matches", 50, query.getResultSize()
> );
>
>                List<Facet> colorFacetList = getFacetListForFacet( query, colorFacetName
> );
>                assertFacetCounts( colorFacetList, new int[] { 12, 12, 12, 12, 2 } );
>
>                List<Facet> ccsFacetList = getFacetListForFacet( query, ccsFacetName );
>                assertFacetCounts( ccsFacetList, new int[] { 17, 16, 16, 1 } );
>
>                FacetFilter facetFilter = new FacetFilter();
>                query.setFilter( facetFilter );
>
>                facetFilter.addFacet( colorFacetList.get( 0 ) );
>                colorFacetList = getFacetListForFacet( query, colorFacetName );
>                assertFacetCounts( colorFacetList, new int[] { 12, 0, 0, 0, 0 } );
>
>                ccsFacetList = getFacetListForFacet( query, ccsFacetName );
>                assertFacetCounts( ccsFacetList, new int[] { 4, 4, 4, 0 } );
>
>                facetFilter.addFacet( ccsFacetList.get( 0 ) );
>                // needs to set the filter explicitly atm, because I need the query
> state to reset
>                query.setFilter( facetFilter );
>                colorFacetList = getFacetListForFacet( query, colorFacetName );
>                assertFacetCounts( colorFacetList, new int[] { 4, 0, 0, 0, 0 } );
>
>                ccsFacetList = getFacetListForFacet( query, ccsFacetName );
>                assertFacetCounts( ccsFacetList, new int[] { 4, 0, 0, 0 } );
>        }
>
> I like the idea of using Lucene Filters to implement the drilldown for. It
> seems the most natural and the original query stays
> untouched.
>
> --Hardy
>
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>




More information about the hibernate-dev mailing list