Hibernate-Search Multiple-value Facet-Counts

Introduction

The hibernate-search facet search API is pretty amazing but it lacks a little on the following:

  • Facet-Count values are incorrect where a facet matches a fields that have multiple values. I.e. the facet-counts are correct where the facet has a 1-to-many relationship with result-set items but the facet-counts are entirely incorrect where the facet has a many-to-many relationship with result-set items.
  • The facet-count values are that of the number of matched result-set items within the result-set as distinct from the number of matched result-set items that will be merged into the result-set if the facet is applied. This is highly undesirable where more than one facet-group is used conjunctively. Let’s explain…
    • Facet-counts are available before any facets are applied. Adjusted facet-counts are available after facets are applied. This is great because it facilitates two different usages. With the former, the facet-counts can remain static as facets are selected and deselected. With the latter, applying one facet will reduce the facet-count for other facets. In fact, the other facet-counts can reduce to zero. This zero count does not necessarily mean no result-set items will result from applying the facet. Consequently, we don’t know if clicking on the facet will yield new results or not. If a facet yields no results, and it is used in conjunction with facets from another facet group, this can lead to a zero-results situation. Confused? no problem Ok, allot of detail, description, example and analysis is provided in this blog.
  • These issues are identified in the following discussion threads:
  • This blog delivers a comprehensive solution to all issues surrounding facet-counts in hibernate-search. The solution is derived from the information provided here: http://sujitpal.blogspot.ie/2007/04/lucene-search-within-search-with.html. A java class that delivers the solution is provided. There is also a fully working maven project demonstrating the solution in action.

Continue reading “Hibernate-Search Multiple-value Facet-Counts”

Understanding Faceted Searching

Introduction

Tony Russell-Rose describes faceted searching in great detail in these posts:

http://isquared.wordpress.com/2011/04/12/interaction-models-for-faceted-search/

http://java.dzone.com/articles/designing-faceted-search

http://isquared.wordpress.com/2011/04/28/where-am-i-techniques-for-wayfinding-and-navigation-in-faceted-search/

http://isquared.wordpress.com/2011/02/17/reflections-on-faceted-search-and-beyond/

They’re well worth a read before even contemplating developing a faceted search.

There are many types of faceting techniques available. This blog focuses on a facet-search where the facets and results remain on a single page. Facets dynamically reduce and expand the result-set on the same page. A good comparable might be the faceted people search on LinkedIn.com. This one is also a really good example: http://www.bikersbest.dk/en-gb/shop/accessories/fenders-etc

We’re going to describe faceted searching and its oddities through example. The examples proliferate in complexity towards an end result which hopefully will yield an understanding of how faceted searching can (or dare I indulge, should work). Some rules for development/behavior will emerge; these will be emphasized and summarized throughout. At the end there is some rambling and a solution for a hibernate-search implementation but for the first 99% of the blog there is no focus on implementation; the focus is exclusively on the following.

  • What exactly a faceted search really is.
  • The behavior of the result-set in response to applying or removing facet selections.
  • What the numbers beside the facets (facet-counts) really mean (cardinality).
  • The different relationships between facets and result-sets e.g. 1-to-Many V.s. Many-to-Many.

The examples used throughout are simple to understand but they will provoke allot of thought because filtering results by facets is not as straight forward a process as may seem at an initial glance. It can be extremely confusing. Each example is a fully working jsFiddle.

Continue reading “Understanding Faceted Searching”