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 Michael Lackhoff <mi...@lackhoff.de> on 2014/03/03 15:35:39 UTC
Solution for reverse order of year facets?
If I understand the docs right, it is only possible to sort facets by
count or value in ascending order. Both variants are not very helpful
for year facets if I want the most recent years at the top (or appear at
all if I restrict the number of facet entries).
It looks like a requirement that was articulated repeatedly and the
recommended solution seems to be to do some math like 10000 - year and
index that. So far so good. Only problem is that I have many data
sources and I would like to avoid to change every connector to include
the new field. I think a better solution would be to have a custom
TokenFilterFactory that does it.
Since it seems a common request, did someone already build such a
TokenFilterFactory? If not, do you think I could build one myself? I do
some (script-)programming but have no experience with Java, so I think I
could adapt an example. Are there any guides out there?
Or even better, is there a built-in solution I haven't heard of?
-Michael
Re: Solution for reverse order of year facets?
Posted by Michael Lackhoff <mi...@lackhoff.de>.
On 03.03.2014 19:58 Shawn Heisey wrote:
> There's already an issue in Jira.
>
> https://issues.apache.org/jira/browse/SOLR-1672
Thanks, this is of course the best solution. Only problem is that I use
a custom verson from a vendor (based on version 4.3) I want to enhance.
But perhaps they apply the patch. In the meantime I still think the
custom filter could be a workaround.
> I can't take a look now, but I will later if someone else hasn't taken
> it up.
That would be great!
Thanks
-Michael
Re: Solution for reverse order of year facets?
Posted by Shawn Heisey <so...@elyograg.org>.
On 3/3/2014 7:35 AM, Michael Lackhoff wrote:
> If I understand the docs right, it is only possible to sort facets by
> count or value in ascending order. Both variants are not very helpful
> for year facets if I want the most recent years at the top (or appear at
> all if I restrict the number of facet entries).
There's already an issue in Jira.
https://issues.apache.org/jira/browse/SOLR-1672
I can't take a look now, but I will later if someone else hasn't taken
it up.
Thanks,
Shawn
Re: Solution for reverse order of year facets?
Posted by Michael Lackhoff <mi...@lackhoff.de>.
Hi Ahmet,
> I forgot to include what I did for one customer :
>
> 1) Using StatsComponent I get min and max values of the field (year)
> 2) Calculate "smart gap/range values" according to minimum and maximum.
> 3) Re-issue the same query (for thee second time) that includes a set of facet.query.
It's amazing, everyone I am talking with about this problem seems to
remember some hack(s) to work around the problem ;-)
On one hand it shows, there are some options (and thanks for giving me
some more!) but on the other hand it also shows how much need there is
for a real solution like SOLR-1672. I really hope Shawn finds some time
to make it work.
-Michael
Re: Solution for reverse order of year facets?
Posted by Ahmet Arslan <io...@yahoo.com>.
Hi Michael,
I forgot to include what I did for one customer :
1) Using StatsComponent I get min and max values of the field (year)
2) Calculate "smart gap/range values" according to minimum and maximum.
3) Re-issue the same query (for thee second time) that includes a set of facet.query.
Ahmet
On Monday, March 3, 2014 10:30 PM, Ahmet Arslan <io...@yahoo.com> wrote:
Hi,
Regarding "just a simple subtraction" you do it in indexer code or in a update prcessor too. You can either modify original field or you can create an additional one. Java-script could be used : http://wiki.apache.org/solr/ScriptUpdateProcessor
Ahmet
On Monday, March 3, 2014 9:11 PM, Michael Lackhoff <mi...@lackhoff.de> wrote:
Hi Ahmet,
> There is no built in solution for this.
Yes, I know, that's why I would like the TokenFilterFactory
> Two workaround :
>
> 1) use facet.limit=-1 and invert the list (faceting response) at client side
>
> 2) use multiples facet.query
> a)facet.query=year:[2012 TO 2014]&facet.query=year:[2010 TO 2012]
> b)facet.query=year:2014&facet.query=year:2013 ...
I thought about these but they have the disadvantage that 1) could
return hundreds of facet entries. 2b) is better but would need about 30
facet-queries which makes quite a long URL and it wouldn't always work
as expected. There are subjects that were very popular in the past but
with no (or very few) recent publications. For these I would get empty
results for my 2014-1985 facet-queries but miss all the stuff from the
1960s.
From all these thoughts I came to the conclusion that a custom
TokenFilterFactory could do exactly what I want. In effect it would give
me a reverse sort:
10000 - 2014 = 7986
10000 - 2013 = 7987
...
The client code can easily regain the original year values for display.
And I think it shouldn't be too difficult to write such a beast, only
problem is I am not a Java programmer. That is why I asked if someone
has done it already or if there is a guide I could use.
After all it is just a simple subtraction...
-Michael
Re: Solution for reverse order of year facets?
Posted by Ahmet Arslan <io...@yahoo.com>.
Hi,
Regarding "just a simple subtraction" you do it in indexer code or in a update prcessor too. You can either modify original field or you can create an additional one. Java-script could be used : http://wiki.apache.org/solr/ScriptUpdateProcessor
Ahmet
On Monday, March 3, 2014 9:11 PM, Michael Lackhoff <mi...@lackhoff.de> wrote:
Hi Ahmet,
> There is no built in solution for this.
Yes, I know, that's why I would like the TokenFilterFactory
> Two workaround :
>
> 1) use facet.limit=-1 and invert the list (faceting response) at client side
>
> 2) use multiples facet.query
> a)facet.query=year:[2012 TO 2014]&facet.query=year:[2010 TO 2012]
> b)facet.query=year:2014&facet.query=year:2013 ...
I thought about these but they have the disadvantage that 1) could
return hundreds of facet entries. 2b) is better but would need about 30
facet-queries which makes quite a long URL and it wouldn't always work
as expected. There are subjects that were very popular in the past but
with no (or very few) recent publications. For these I would get empty
results for my 2014-1985 facet-queries but miss all the stuff from the
1960s.
From all these thoughts I came to the conclusion that a custom
TokenFilterFactory could do exactly what I want. In effect it would give
me a reverse sort:
10000 - 2014 = 7986
10000 - 2013 = 7987
...
The client code can easily regain the original year values for display.
And I think it shouldn't be too difficult to write such a beast, only
problem is I am not a Java programmer. That is why I asked if someone
has done it already or if there is a guide I could use.
After all it is just a simple subtraction...
-Michael
Re: Solution for reverse order of year facets?
Posted by Michael Lackhoff <mi...@lackhoff.de>.
Hi Ahmet,
> There is no built in solution for this.
Yes, I know, that's why I would like the TokenFilterFactory
> Two workaround :
>
> 1) use facet.limit=-1 and invert the list (faceting response) at client side
>
> 2) use multiples facet.query
> a)facet.query=year:[2012 TO 2014]&facet.query=year:[2010 TO 2012]
> b)facet.query=year:2014&facet.query=year:2013 ...
I thought about these but they have the disadvantage that 1) could
return hundreds of facet entries. 2b) is better but would need about 30
facet-queries which makes quite a long URL and it wouldn't always work
as expected. There are subjects that were very popular in the past but
with no (or very few) recent publications. For these I would get empty
results for my 2014-1985 facet-queries but miss all the stuff from the
1960s.
>From all these thoughts I came to the conclusion that a custom
TokenFilterFactory could do exactly what I want. In effect it would give
me a reverse sort:
10000 - 2014 = 7986
10000 - 2013 = 7987
...
The client code can easily regain the original year values for display.
And I think it shouldn't be too difficult to write such a beast, only
problem is I am not a Java programmer. That is why I asked if someone
has done it already or if there is a guide I could use.
After all it is just a simple subtraction...
-Michael
Re: Solution for reverse order of year facets?
Posted by Ahmet Arslan <io...@yahoo.com>.
Hi Michael,
Yes you are correct, oldest comes fist.
There is no built in solution for this.
Two workaround :
1) use facet.limit=-1 and invert the list (faceting response) at client side
2) use multiples facet.query
a)facet.query=year:[2012 TO 2014]&facet.query=year:[2010 TO 2012]
b)facet.query=year:2014&facet.query=year:2013 ...
On Monday, March 3, 2014 5:45 PM, Michael Lackhoff <mi...@lackhoff.de> wrote:
On 03.03.2014 16:33 Ahmet Arslan wrote:
> Currently there are two storing criteria available. However sort by index - to return the constraints sorted in their index order (lexicographic by indexed term) - should return most recent year at top, no?
No, it returns them -- as you say -- in lexicographic order and that
means oldest first, like:
1815
1820
...
2012
2013
(might well stop before we get here)
2014
-Michael
Re: Solution for reverse order of year facets?
Posted by Michael Lackhoff <mi...@lackhoff.de>.
On 03.03.2014 16:33 Ahmet Arslan wrote:
> Currently there are two storing criteria available. However sort by index - to return the constraints sorted in their index order (lexicographic by indexed term) - should return most recent year at top, no?
No, it returns them -- as you say -- in lexicographic order and that
means oldest first, like:
1815
1820
...
2012
2013
(might well stop before we get here)
2014
-Michael
Re: Solution for reverse order of year facets?
Posted by Ahmet Arslan <io...@yahoo.com>.
Hi,
Currently there are two storing criteria available. However sort by index - to return the constraints sorted in their index order (lexicographic by indexed term) - should return most recent year at top, no?
Ahmet
On Monday, March 3, 2014 4:36 PM, Michael Lackhoff <mi...@lackhoff.de> wrote:
If I understand the docs right, it is only possible to sort facets by
count or value in ascending order. Both variants are not very helpful
for year facets if I want the most recent years at the top (or appear at
all if I restrict the number of facet entries).
It looks like a requirement that was articulated repeatedly and the
recommended solution seems to be to do some math like 10000 - year and
index that. So far so good. Only problem is that I have many data
sources and I would like to avoid to change every connector to include
the new field. I think a better solution would be to have a custom
TokenFilterFactory that does it.
Since it seems a common request, did someone already build such a
TokenFilterFactory? If not, do you think I could build one myself? I do
some (script-)programming but have no experience with Java, so I think I
could adapt an example. Are there any guides out there?
Or even better, is there a built-in solution I haven't heard of?
-Michael