“Car sale application”– Result Grouping, let’s group some search results (part 6)

In today’s post we will try to add to our car sale application the new functionality, which allows us to group some search results. Let’s imagine a user who would like to search for “audi a4” advertisements and as a result get the results grouped by car’s year of production, with 2-3 results in every group. And how about some range grouping, for example mileage ranges? Today we will accept the challenge.

New functionality request parameters description

Result grouping functionality is available since solr 3.3. Let’s get to know some of it’s request parameters we will surely need:

  • group – turn on and off result grouping
  • group.field – field name used to group search results. We have to be sure that the field used for grouping (year of production in our case) is single-valued and have the string/text type
  • group.query – query used to group results by ranges, for example mileage ranges
  • group.limit – the number of results to return for each group

This four basic parameters allow us to achieve what we want.

schema.xml changes

Possible schema.xml changes can be made in order to be sure that the group field is of the proper type (“string” or “text”). We would like to group our search results by “year” field, so let’s recall how the definition looks right now:

The field is of integer type. In order to be able to group results using this field, we create another “year” field, let’s call it “year_group”, which will have the string type:

and copy the content of the “year” field to the new field called “year_group”:

That’s practically all the changes we should do in our schema.xml configration file.

Some sample data

Let’s now create some sample data in order to test the new functionality. We assume that we have some samples of Audi A4 car data. Two of them are year 2002, another two 2003 and the last one is 2006. Additionally, one of them has the mileage below 100 000 km, three of them have the mileage in the range between 100 000 km and 199 999 km and the last one has the mileage over 200 000 km:

Let’s create queries

Using the parameters described at the beginning of the article, we create the “audi A4” query, which will show us some search results grouped by the year of production:

As we see, we have limited the results in every group to max 2. In response we would like to have only those fields, which will help us clearly and readably identify the documents, so: id, mileage, make, model and year. As a result we have the response:

Let’s analyse the response. We have 5 matches:

The response has been split into 3 independent groups:

  1. where we have two (numFound=”2″) 2002 cars

  2. where we have two (numFound=”2″) 2003 cars

  3. where we have one (numFound=”1″) 2006 car

That’s correct!

Now let’s create query, which will group our search results by the mileage ranges. We assume that we have 3 ranges:

  1. <0km ; 99999km>
  2. <100000km ; 199999km>
  3. <200000km ; * >


and response:

Again we have 5 search results. In the first group there is a car with the mileage of 9900 km, in the second group there are cars with the mileage of 197000 km, 125000 km and 150000 km, and finally in the third group there is a car with the mileage of 220000km. We achieve what we wanted. Mission accomplished.

The end

Yet another functionality, this time search results grouping one, is now added to our car sale application. We will surely see what will be the users opinions 🙂

3 thoughts on ““Car sale application”– Result Grouping, let’s group some search results (part 6)

  • 6 July 2011 at 15:35

    Can the last query example be grouped (further) by a field (e.g. year)?

    • 6 July 2011 at 17:10

      You mean something like a subgroup in a group ? No, unfortunately it cannot (yet hopefully:). But within the group you can for example sort the documents using group.sort parameter, for example:
      As the response you should have the documents within every group sorted by year decreasingly.

  • 8 July 2011 at 05:44

    I see. I was thinking of using the said approach as a nested grouping workaround.


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.