Agreed, I also prefer the second way. I find it more readible, less verbose
while communicating the same information, less confusing to mentally parse
("is 'terms' the name of my facet, or the type of my facet?..."), and less
prone to syntactlcally valid, but logically invalid inputs.  Let's break
those topics down.

*1) Less verbose while communicating the same information:*
The flatter structure is particularly useful when you have nested facets to
reduce unnecessary verbosity / extra levels. Let's contrast the two
approaches with just 2 levels of subfacets:

** Current Format **
top_genres:{
    terms:{
        field: genre,
        limit: 5,
            facet:{
                top_authors:{
                    terms:{
                        field: author,
                        limit: 4,
                        facet: {
                        top_books:{
                            terms:{
                                field: title,
                                limit: 5
               }
           }
                    }
                }
            }
        }
    }
}

** Flat Format **
top_genres:{
    type: terms,
    field: genre,
    limit: 5,
        facet:{
        top_authors:{
            type: terms
            field: author,
            limit: 4,
            facet: {
                top_books:{
                    type: terms
                    field: title,
                    limit: 5
           }
            }
        }
    }
}

The flat format is clearly shorter and more succinct, while communicating
the same information. What value do the extra levels add?


*2) Less confusing to mentally parse*
I also find the flatter structure less confusing, as I'm consistently
having to take a mental pause with the current format to verify whether
"terms" is the name of my facet or the type of my facet and have to count
the curly braces to figure this out.  Not that I would name my facets like
this, but to give an extreme example of why that extra mental calculation
is necessary due to the name of an attribute in the structure being able to
represent both a facet name and facet type:

terms: {
    terms: {
        field: genre,
        limit: 5,
        facet: {
            terms: {
                terms:{
                    field: author
                    limit: 4
                }
            }
        }
    }
}

In this example, the first "terms" is a facet name, the second "terms" is a
facet type, the third is a facet name, etc. Even if you don't name your
facets like this, it still requires parsing someone else's query mentally
to ensure that's not what was done.

3) *Less prone to syntactically valid, but logically invalid inputs*
Also, given this first format (where the type is indicated by one of
several possible attributes: terms, range, etc.), what happens if I pass in
multiple of the valid JSON attributes... the flatter structure prevents
this from being possible (which is a good thing!):

top_authors : {
    terms : {
        field : author,
        limit : 5
    },
    range : {
        field : price,
        start : 0,
        end : 100,
        gap : 20
    }
}

I don't think the response format can currently handle this without adding
in extra levels to make it look like the input side, so this is an
exception case even thought it seems syntactically valid.

So in conclusion, I'd give a strong vote to the flatter structure. Can
someone enumerate the benefits of the current format over the flatter
structure (I'm probably dense and just failing to see them currently)?

Thanks,

-Trey


On Fri, Apr 17, 2015 at 2:28 PM, Jean-Sebastien Vachon <
jean-sebastien.vac...@wantedanalytics.com> wrote:

> I prefer the second way. I find it more readable and shorter.
>
> Thanks for making Solr even better ;)
>
> ________________________________________
> From: Yonik Seeley <ysee...@gmail.com>
> Sent: Friday, April 17, 2015 12:20 PM
> To: solr-user@lucene.apache.org
> Subject: Re: JSON Facet & Analytics API in Solr 5.1
>
> Does anyone have any thoughts on the current general structure of JSON
> facets?
> The current general form of a facet command is:
>
> <facet_name> : { <facet_type> : <facet_args> }
>
> For example:
>
> top_authors : { terms : {
>   field : author,
>   limit : 5,
> }}
>
> One alternative I considered in the past is having the type in the args:
>
> top_authors : {
>   type : terms,
>   field : author,
>   limit : 5
> }
>
> It's a flatter structure... probably better in some ways, but worse in
> other ways.
> Thoughts / preferences?
>
> -Yonik
>
>
> On Tue, Apr 14, 2015 at 4:30 PM, Yonik Seeley <ysee...@gmail.com> wrote:
> > Folks, there's a new JSON Facet API in the just released Solr 5.1
> > (actually, a new facet module under the covers too).
> >
> > It's marked as experimental so we have time to change the API based on
> > your feedback.  So let us know what you like, what you would change,
> > what's missing, or any other ideas you may have!
> >
> > I've just started the documentation for the reference guide (on our
> > confluence wiki), so for now the best doc is on my blog:
> >
> > http://yonik.com/json-facet-api/
> > http://yonik.com/solr-facet-functions/
> > http://yonik.com/solr-subfacets/
> >
> > I'll also be hanging out more on the #solr-dev IRC channel on freenode
> > if you want to hit me up there about any development ideas.
> >
> > -Yonik
>

Reply via email to