You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-user@lucene.apache.org by thibault jouannic <di...@gmail.com> on 2009/09/09 11:53:37 UTC

Catchall field and facet search

Hi Solr users,

This is my first post on this list, so nice to meet you.

I need to do something with solr, but I have no idea how to achieve this. Let me describe my problem.

I'm building an address search engine. In my Solr schema, I've got many fields like «country», «state», «town», «street».

I want my users to search an address by location, so I've set up a catchall field containing a copy of all the other fields. This is my default search field.

I want to propose a dynamic facet search : if a user searches for the term «USA», the used facet.field will be «state», but if he searches for «Chicago», facet.field will be «street». If a user is searching for an address in Chicago, it would be stupid to propose a facet search on the «country» field, would'nt it?

However, how can I know which field is matched ? If the user search «France», how can I know if this is a country or a town ?

Is anybody has an idea?

Best regards,
Thibault.


Re: Catchall field and facet search

Posted by thibault jouannic <di...@gmail.com>.
Hi,

Thank you for the answer. Very helpful.

Regards,
Thibault.

On Wed, 09 Sep 2009 13:36:02 +0200
Uri Boness <ub...@gmail.com> wrote:

> Hi,
> 
> This is a bit tricky but I think you can achieve it as follows:
> 
> 1. have a field called "location_facet" which holds the logical path of 
> the location for each address (e.g. /Eurpoe/England/London)
> 2. have another multi valued filed "location_search" that holds all the 
> locations - your "catchall" field.
> 3. When the user searches for "England", perform the search on the 
> "location_search" field.
> 4. Always facet on the "location_facet" field
> 5. When you get the response, drop the most common prefix from all the 
> facet values, so for example if you search on "England":
> 
> returned facets:
> 
> /Europe/England/London..............5
> /Europe/England/Manchester........6
> /Europe/England/Liverpool...........3
> 
> after dropping the common prefix (which is /Europe/England):
> 
> London............5
> Manchester.....6
> Liverpool........3
> 
> note that theoretically (and perhaps even realistically) you might also 
> have multiple prefixes (for example, in the US you can definitely have 
> several cities with the same name in different states), in which case 
> you'd probably want to group these results by the prefix:
> 
> (for the sake of the argument, let's assume there's an "England" state 
> in the US :-))
> 
> /Europe/England
>   London............5
>   Manchester......6
>   Liverpool.........3
> 
> /North America/USA/England
>   AnotherCity..........10
> 
> On the client side, when the user clicks on one of the facet values, you 
> should use value path as a wildcard filter on the "location_facet" 
> field. For example, if the user click on London (the city in England), 
> the you should add the following filter:
> 
> location_facet:/Europe/England/London/*
> 
> this is a bit of manual work to do on the results, but I think it should 
> work, but maybe someone has a better idea on how to do it in a cleaner way.
> 
> cheers,
> Uri
> 
> thibault jouannic wrote:
> > Hi Solr users,
> >
> > This is my first post on this list, so nice to meet you.
> >
> > I need to do something with solr, but I have no idea how to achieve this. Let me describe my problem.
> >
> > I'm building an address search engine. In my Solr schema, I've got many fields like «country», «state», «town», «street».
> >
> > I want my users to search an address by location, so I've set up a catchall field containing a copy of all the other fields. This is my default search field.
> >
> > I want to propose a dynamic facet search : if a user searches for the term «USA», the used facet.field will be «state», but if he searches for «Chicago», facet.field will be «street». If a user is searching for an address in Chicago, it would be stupid to propose a facet search on the «country» field, would'nt it?
> >
> > However, how can I know which field is matched ? If the user search «France», how can I know if this is a country or a town ?
> >
> > Is anybody has an idea?
> >
> > Best regards,
> > Thibault.
> >
> >
> >   

Re: Catchall field and facet search

Posted by Uri Boness <ub...@gmail.com>.
Hi,

This is a bit tricky but I think you can achieve it as follows:

1. have a field called "location_facet" which holds the logical path of 
the location for each address (e.g. /Eurpoe/England/London)
2. have another multi valued filed "location_search" that holds all the 
locations - your "catchall" field.
3. When the user searches for "England", perform the search on the 
"location_search" field.
4. Always facet on the "location_facet" field
5. When you get the response, drop the most common prefix from all the 
facet values, so for example if you search on "England":

returned facets:

/Europe/England/London..............5
/Europe/England/Manchester........6
/Europe/England/Liverpool...........3

after dropping the common prefix (which is /Europe/England):

London............5
Manchester.....6
Liverpool........3

note that theoretically (and perhaps even realistically) you might also 
have multiple prefixes (for example, in the US you can definitely have 
several cities with the same name in different states), in which case 
you'd probably want to group these results by the prefix:

(for the sake of the argument, let's assume there's an "England" state 
in the US :-))

/Europe/England
  London............5
  Manchester......6
  Liverpool.........3

/North America/USA/England
  AnotherCity..........10

On the client side, when the user clicks on one of the facet values, you 
should use value path as a wildcard filter on the "location_facet" 
field. For example, if the user click on London (the city in England), 
the you should add the following filter:

location_facet:/Europe/England/London/*

this is a bit of manual work to do on the results, but I think it should 
work, but maybe someone has a better idea on how to do it in a cleaner way.

cheers,
Uri

thibault jouannic wrote:
> Hi Solr users,
>
> This is my first post on this list, so nice to meet you.
>
> I need to do something with solr, but I have no idea how to achieve this. Let me describe my problem.
>
> I'm building an address search engine. In my Solr schema, I've got many fields like «country», «state», «town», «street».
>
> I want my users to search an address by location, so I've set up a catchall field containing a copy of all the other fields. This is my default search field.
>
> I want to propose a dynamic facet search : if a user searches for the term «USA», the used facet.field will be «state», but if he searches for «Chicago», facet.field will be «street». If a user is searching for an address in Chicago, it would be stupid to propose a facet search on the «country» field, would'nt it?
>
> However, how can I know which field is matched ? If the user search «France», how can I know if this is a country or a town ?
>
> Is anybody has an idea?
>
> Best regards,
> Thibault.
>
>
>