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 Andrew Meredith <an...@gmail.com> on 2012/06/29 20:43:41 UTC

Filtering a query by range returning unexpected results

First off, I have to say that I am working on my first project that has
required me to work with Solr, so my question my be very elementary - I
just could not find an answer elsewhere.

I am trying to add a ranged query filter that returns all items in a given
"prices" range. In my situation, each item can have multiple prices, so it
is a multivalued field. When I search a range, say, prices:[15.00.00 TO
21.00], I want Solr to return all items that have *any* price in that
range, rather than returning results where *all* prices are in the range.
For example, if i have an item with the following prices, it will not be
returned:
  <arr name="prices">
  <str>19.99,USD</str>
  <str>22.50,USD</str>
  </arr>

Is there any way to change the behaviour of Solr so that it will match
documents in which any value of a multivalued field matches a ranged query
filter?

Thanks!

-- 
<http://ofchristonearth.wordpress.com/>
S.D.G.

Re: Filtering a query by range returning unexpected results

Posted by Erick Erickson <er...@gmail.com>.
For future reference, JIRA is here:
https://issues.apache.org/jira/browse/SOLR-3595

Erick

On Thu, Jul 5, 2012 at 4:19 PM, Andrew Meredith <an...@gmail.com> wrote:
> Thanks! That worked. I re-built the index with my "prices" field being of
> the tfloat type, and I am now able to perform range queries. I appreciate
> your help, Erick.
>
> On Tue, Jul 3, 2012 at 9:35 AM, Erick Erickson <er...@gmail.com>wrote:
>
>> OK, this appears to be something with the "currency" type. It works fine
>> for
>> regular float fields. I can't get the multiValued currency types to work
>> with
>> range queries. Don't quite know what I was doing when I thought they
>> _did_ work.
>>
>> One work-around I think, if you are using a single currency USD might be
>> to copy your price to a simple float field and do your range queries on
>> that.
>>
>> I'm not at all sure that the currency type was ever intended to support
>> multiValued="true". I don't know enough about the internals to know if
>> it's even a good idea to try, but the current behavior could be improved
>> upon.
>>
>> But it seems to me that one of two things should happen:
>> 1> the startup should barf if a currency type is multiValued (fail early)
>> or
>> 2> currency should work when multiValued.
>>
>> Unfortunately, JIRA is down so I can't look to see if this is already a
>> known
>> issue or enter a JIRA if it isn't. I'll try to look later if it all
>> comes back up.
>>
>> Best
>> Erick
>>
>> On Mon, Jul 2, 2012 at 1:53 PM, Andrew Meredith <an...@gmail.com>
>> wrote:
>> > Yep, that 15.00.00 was a typo.
>> >
>> > Here are the relevant portions of my schema.xml:
>> >
>> > <types>
>> >     <!-- CUT -->
>> >     <fieldType name="currency" class="solr.CurrencyField"
>> precisionStep="8"
>> > defaultCurrency="USD" currencyConfig="currency.xml" />
>> >     <!-- CUT -->
>> > </types>
>> >
>> > <fields>
>> >     <!-- CUT -->
>> >     <field name="prices" type="currency" indexed="true" stored="true"
>> > multiValued="true" />
>> >     <!-- CUT -->
>> > </fields>
>> >
>> > And here is the output of a sample query with &debugQuery=on appended:
>> >
>> > <lst name="debug">
>> > <str name="rawquerystring">Furtick</str>
>> > <str name="querystring">Furtick</str>
>> > <str name="parsedquery">
>> > +DisjunctionMaxQuery((subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
>> > frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
>> > title:furtick^2.0)) ()
>> > </str>
>> > <str name="parsedquery_toString">
>> > +(subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
>> > frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
>> > title:furtick^2.0) ()
>> > </str>
>> > <lst name="explain"/>
>> > <str name="QParser">ExtendedDismaxQParser</str>
>> > <null name="altquerystring"/>
>> > <null name="boostfuncs"/>
>> > <arr name="filter_queries">
>> > <str>prices:[5.00 TO 21.00]</str>
>> > <str>forsaleinusa:true</str>
>> > </arr>
>> > <arr name="parsed_filter_queries">
>> > <str>
>> > ConstantScore(frange(currency(prices)):[500 TO 2100])
>> > </str>
>> > <str>forsaleinusa:true</str>
>> > </arr>
>> > <lst name="timing">
>> > <double name="time">3.0</double>
>> > <lst name="prepare">
>> > <double name="time">2.0</double>
>> > <lst name="org.apache.solr.handler.component.QueryComponent">
>> > <double name="time">2.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.FacetComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.HighlightComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.StatsComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.SpellCheckComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.DebugComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > </lst>
>> > <lst name="process">
>> > <double name="time">1.0</double>
>> > <lst name="org.apache.solr.handler.component.QueryComponent">
>> > <double name="time">1.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.FacetComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.HighlightComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.StatsComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.SpellCheckComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > <lst name="org.apache.solr.handler.component.DebugComponent">
>> > <double name="time">0.0</double>
>> > </lst>
>> > </lst>
>> > </lst>
>> > </lst>
>> >
>> >
>> > If I run this same query with the filter, prices:[5.00 TO 99.00], then I
>> > get a result that includes the following field:
>> >
>> > <arr name="prices">
>> > <str>12.99,USD</str>
>> > <str>14.99,USD</str>
>> > <str>15.00,USD</str>
>> > <str>25.00,USD</str>
>> > </arr>
>> >
>> >
>> > I can't figure out why this is not being returned with the first query.
>> > I'll try re-building the index with the "prices" field type set to float
>> > and see if that changes the behaviour.
>> >
>> > On Sat, Jun 30, 2012 at 6:49 PM, Erick Erickson <erickerickson@gmail.com
>> >wrote:
>> >
>> >> This works fine for me with 3.6, float fields and even on a currency
>> type.
>> >>
>> >> I'm assuming a typo for 15.00.00 BTW.
>> >>
>> >> I admit I'm not all that familiar with the "currency" type, which I
>> infer
>> >> you're
>> >> using given the "USD" bits. But I ran a quick test with currency types
>> and
>> >> it worked at least the way I ran it... But another quick look shows that
>> >> some interesting things are being done with the "currency" type, so who
>> >> knows?
>> >>
>> >> So, let's see your relevant schema bits, and the results of your query
>> >> when you attach &debugQuery=on to it.....
>> >>
>> >>
>> >> Best
>> >> Erick
>> >>
>> >> On Fri, Jun 29, 2012 at 2:43 PM, Andrew Meredith <
>> andymeredith@gmail.com>
>> >> wrote:
>> >> > First off, I have to say that I am working on my first project that
>> has
>> >> > required me to work with Solr, so my question my be very elementary -
>> I
>> >> > just could not find an answer elsewhere.
>> >> >
>> >> > I am trying to add a ranged query filter that returns all items in a
>> >> given
>> >> > "prices" range. In my situation, each item can have multiple prices,
>> so
>> >> it
>> >> > is a multivalued field. When I search a range, say, prices:[15.00.00
>> TO
>> >> > 21.00], I want Solr to return all items that have *any* price in that
>> >> > range, rather than returning results where *all* prices are in the
>> range.
>> >> > For example, if i have an item with the following prices, it will not
>> be
>> >> > returned:
>> >> >   <arr name="prices">
>> >> >   <str>19.99,USD</str>
>> >> >   <str>22.50,USD</str>
>> >> >   </arr>
>> >> >
>> >> > Is there any way to change the behaviour of Solr so that it will match
>> >> > documents in which any value of a multivalued field matches a ranged
>> >> query
>> >> > filter?
>> >> >
>> >> > Thanks!
>> >> >
>> >> > --
>> >> > <http://ofchristonearth.wordpress.com/>
>> >> > S.D.G.
>> >>
>> >
>> >
>> >
>> > --
>> > Andrew Meredith
>> >
>> > Personal Blog: Soli Deo Gloria <http://kendru.wordpress.com/>
>> > Programming Blog <http://www.andrewmeredith.info>
>> >
>> > S.D.G.
>>
>
>
>
> --
> Andrew Meredith
>
> Personal Blog: Soli Deo Gloria <http://kendru.wordpress.com/>
> Programming Blog <http://www.andrewmeredith.info>
>
> S.D.G.

Re: Filtering a query by range returning unexpected results

Posted by Andrew Meredith <an...@gmail.com>.
Thanks! That worked. I re-built the index with my "prices" field being of
the tfloat type, and I am now able to perform range queries. I appreciate
your help, Erick.

On Tue, Jul 3, 2012 at 9:35 AM, Erick Erickson <er...@gmail.com>wrote:

> OK, this appears to be something with the "currency" type. It works fine
> for
> regular float fields. I can't get the multiValued currency types to work
> with
> range queries. Don't quite know what I was doing when I thought they
> _did_ work.
>
> One work-around I think, if you are using a single currency USD might be
> to copy your price to a simple float field and do your range queries on
> that.
>
> I'm not at all sure that the currency type was ever intended to support
> multiValued="true". I don't know enough about the internals to know if
> it's even a good idea to try, but the current behavior could be improved
> upon.
>
> But it seems to me that one of two things should happen:
> 1> the startup should barf if a currency type is multiValued (fail early)
> or
> 2> currency should work when multiValued.
>
> Unfortunately, JIRA is down so I can't look to see if this is already a
> known
> issue or enter a JIRA if it isn't. I'll try to look later if it all
> comes back up.
>
> Best
> Erick
>
> On Mon, Jul 2, 2012 at 1:53 PM, Andrew Meredith <an...@gmail.com>
> wrote:
> > Yep, that 15.00.00 was a typo.
> >
> > Here are the relevant portions of my schema.xml:
> >
> > <types>
> >     <!-- CUT -->
> >     <fieldType name="currency" class="solr.CurrencyField"
> precisionStep="8"
> > defaultCurrency="USD" currencyConfig="currency.xml" />
> >     <!-- CUT -->
> > </types>
> >
> > <fields>
> >     <!-- CUT -->
> >     <field name="prices" type="currency" indexed="true" stored="true"
> > multiValued="true" />
> >     <!-- CUT -->
> > </fields>
> >
> > And here is the output of a sample query with &debugQuery=on appended:
> >
> > <lst name="debug">
> > <str name="rawquerystring">Furtick</str>
> > <str name="querystring">Furtick</str>
> > <str name="parsedquery">
> > +DisjunctionMaxQuery((subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
> > frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
> > title:furtick^2.0)) ()
> > </str>
> > <str name="parsedquery_toString">
> > +(subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
> > frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
> > title:furtick^2.0) ()
> > </str>
> > <lst name="explain"/>
> > <str name="QParser">ExtendedDismaxQParser</str>
> > <null name="altquerystring"/>
> > <null name="boostfuncs"/>
> > <arr name="filter_queries">
> > <str>prices:[5.00 TO 21.00]</str>
> > <str>forsaleinusa:true</str>
> > </arr>
> > <arr name="parsed_filter_queries">
> > <str>
> > ConstantScore(frange(currency(prices)):[500 TO 2100])
> > </str>
> > <str>forsaleinusa:true</str>
> > </arr>
> > <lst name="timing">
> > <double name="time">3.0</double>
> > <lst name="prepare">
> > <double name="time">2.0</double>
> > <lst name="org.apache.solr.handler.component.QueryComponent">
> > <double name="time">2.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.FacetComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.HighlightComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.StatsComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.SpellCheckComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.DebugComponent">
> > <double name="time">0.0</double>
> > </lst>
> > </lst>
> > <lst name="process">
> > <double name="time">1.0</double>
> > <lst name="org.apache.solr.handler.component.QueryComponent">
> > <double name="time">1.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.FacetComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.HighlightComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.StatsComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.SpellCheckComponent">
> > <double name="time">0.0</double>
> > </lst>
> > <lst name="org.apache.solr.handler.component.DebugComponent">
> > <double name="time">0.0</double>
> > </lst>
> > </lst>
> > </lst>
> > </lst>
> >
> >
> > If I run this same query with the filter, prices:[5.00 TO 99.00], then I
> > get a result that includes the following field:
> >
> > <arr name="prices">
> > <str>12.99,USD</str>
> > <str>14.99,USD</str>
> > <str>15.00,USD</str>
> > <str>25.00,USD</str>
> > </arr>
> >
> >
> > I can't figure out why this is not being returned with the first query.
> > I'll try re-building the index with the "prices" field type set to float
> > and see if that changes the behaviour.
> >
> > On Sat, Jun 30, 2012 at 6:49 PM, Erick Erickson <erickerickson@gmail.com
> >wrote:
> >
> >> This works fine for me with 3.6, float fields and even on a currency
> type.
> >>
> >> I'm assuming a typo for 15.00.00 BTW.
> >>
> >> I admit I'm not all that familiar with the "currency" type, which I
> infer
> >> you're
> >> using given the "USD" bits. But I ran a quick test with currency types
> and
> >> it worked at least the way I ran it... But another quick look shows that
> >> some interesting things are being done with the "currency" type, so who
> >> knows?
> >>
> >> So, let's see your relevant schema bits, and the results of your query
> >> when you attach &debugQuery=on to it.....
> >>
> >>
> >> Best
> >> Erick
> >>
> >> On Fri, Jun 29, 2012 at 2:43 PM, Andrew Meredith <
> andymeredith@gmail.com>
> >> wrote:
> >> > First off, I have to say that I am working on my first project that
> has
> >> > required me to work with Solr, so my question my be very elementary -
> I
> >> > just could not find an answer elsewhere.
> >> >
> >> > I am trying to add a ranged query filter that returns all items in a
> >> given
> >> > "prices" range. In my situation, each item can have multiple prices,
> so
> >> it
> >> > is a multivalued field. When I search a range, say, prices:[15.00.00
> TO
> >> > 21.00], I want Solr to return all items that have *any* price in that
> >> > range, rather than returning results where *all* prices are in the
> range.
> >> > For example, if i have an item with the following prices, it will not
> be
> >> > returned:
> >> >   <arr name="prices">
> >> >   <str>19.99,USD</str>
> >> >   <str>22.50,USD</str>
> >> >   </arr>
> >> >
> >> > Is there any way to change the behaviour of Solr so that it will match
> >> > documents in which any value of a multivalued field matches a ranged
> >> query
> >> > filter?
> >> >
> >> > Thanks!
> >> >
> >> > --
> >> > <http://ofchristonearth.wordpress.com/>
> >> > S.D.G.
> >>
> >
> >
> >
> > --
> > Andrew Meredith
> >
> > Personal Blog: Soli Deo Gloria <http://kendru.wordpress.com/>
> > Programming Blog <http://www.andrewmeredith.info>
> >
> > S.D.G.
>



-- 
Andrew Meredith

Personal Blog: Soli Deo Gloria <http://kendru.wordpress.com/>
Programming Blog <http://www.andrewmeredith.info>

S.D.G.

Re: Filtering a query by range returning unexpected results

Posted by Erick Erickson <er...@gmail.com>.
OK, this appears to be something with the "currency" type. It works fine for
regular float fields. I can't get the multiValued currency types to work with
range queries. Don't quite know what I was doing when I thought they
_did_ work.

One work-around I think, if you are using a single currency USD might be
to copy your price to a simple float field and do your range queries on that.

I'm not at all sure that the currency type was ever intended to support
multiValued="true". I don't know enough about the internals to know if
it's even a good idea to try, but the current behavior could be improved
upon.

But it seems to me that one of two things should happen:
1> the startup should barf if a currency type is multiValued (fail early)
or
2> currency should work when multiValued.

Unfortunately, JIRA is down so I can't look to see if this is already a known
issue or enter a JIRA if it isn't. I'll try to look later if it all
comes back up.

Best
Erick

On Mon, Jul 2, 2012 at 1:53 PM, Andrew Meredith <an...@gmail.com> wrote:
> Yep, that 15.00.00 was a typo.
>
> Here are the relevant portions of my schema.xml:
>
> <types>
>     <!-- CUT -->
>     <fieldType name="currency" class="solr.CurrencyField" precisionStep="8"
> defaultCurrency="USD" currencyConfig="currency.xml" />
>     <!-- CUT -->
> </types>
>
> <fields>
>     <!-- CUT -->
>     <field name="prices" type="currency" indexed="true" stored="true"
> multiValued="true" />
>     <!-- CUT -->
> </fields>
>
> And here is the output of a sample query with &debugQuery=on appended:
>
> <lst name="debug">
> <str name="rawquerystring">Furtick</str>
> <str name="querystring">Furtick</str>
> <str name="parsedquery">
> +DisjunctionMaxQuery((subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
> frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
> title:furtick^2.0)) ()
> </str>
> <str name="parsedquery_toString">
> +(subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
> frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
> title:furtick^2.0) ()
> </str>
> <lst name="explain"/>
> <str name="QParser">ExtendedDismaxQParser</str>
> <null name="altquerystring"/>
> <null name="boostfuncs"/>
> <arr name="filter_queries">
> <str>prices:[5.00 TO 21.00]</str>
> <str>forsaleinusa:true</str>
> </arr>
> <arr name="parsed_filter_queries">
> <str>
> ConstantScore(frange(currency(prices)):[500 TO 2100])
> </str>
> <str>forsaleinusa:true</str>
> </arr>
> <lst name="timing">
> <double name="time">3.0</double>
> <lst name="prepare">
> <double name="time">2.0</double>
> <lst name="org.apache.solr.handler.component.QueryComponent">
> <double name="time">2.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.FacetComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.HighlightComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.StatsComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.SpellCheckComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.DebugComponent">
> <double name="time">0.0</double>
> </lst>
> </lst>
> <lst name="process">
> <double name="time">1.0</double>
> <lst name="org.apache.solr.handler.component.QueryComponent">
> <double name="time">1.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.FacetComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.HighlightComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.StatsComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.SpellCheckComponent">
> <double name="time">0.0</double>
> </lst>
> <lst name="org.apache.solr.handler.component.DebugComponent">
> <double name="time">0.0</double>
> </lst>
> </lst>
> </lst>
> </lst>
>
>
> If I run this same query with the filter, prices:[5.00 TO 99.00], then I
> get a result that includes the following field:
>
> <arr name="prices">
> <str>12.99,USD</str>
> <str>14.99,USD</str>
> <str>15.00,USD</str>
> <str>25.00,USD</str>
> </arr>
>
>
> I can't figure out why this is not being returned with the first query.
> I'll try re-building the index with the "prices" field type set to float
> and see if that changes the behaviour.
>
> On Sat, Jun 30, 2012 at 6:49 PM, Erick Erickson <er...@gmail.com>wrote:
>
>> This works fine for me with 3.6, float fields and even on a currency type.
>>
>> I'm assuming a typo for 15.00.00 BTW.
>>
>> I admit I'm not all that familiar with the "currency" type, which I infer
>> you're
>> using given the "USD" bits. But I ran a quick test with currency types and
>> it worked at least the way I ran it... But another quick look shows that
>> some interesting things are being done with the "currency" type, so who
>> knows?
>>
>> So, let's see your relevant schema bits, and the results of your query
>> when you attach &debugQuery=on to it.....
>>
>>
>> Best
>> Erick
>>
>> On Fri, Jun 29, 2012 at 2:43 PM, Andrew Meredith <an...@gmail.com>
>> wrote:
>> > First off, I have to say that I am working on my first project that has
>> > required me to work with Solr, so my question my be very elementary - I
>> > just could not find an answer elsewhere.
>> >
>> > I am trying to add a ranged query filter that returns all items in a
>> given
>> > "prices" range. In my situation, each item can have multiple prices, so
>> it
>> > is a multivalued field. When I search a range, say, prices:[15.00.00 TO
>> > 21.00], I want Solr to return all items that have *any* price in that
>> > range, rather than returning results where *all* prices are in the range.
>> > For example, if i have an item with the following prices, it will not be
>> > returned:
>> >   <arr name="prices">
>> >   <str>19.99,USD</str>
>> >   <str>22.50,USD</str>
>> >   </arr>
>> >
>> > Is there any way to change the behaviour of Solr so that it will match
>> > documents in which any value of a multivalued field matches a ranged
>> query
>> > filter?
>> >
>> > Thanks!
>> >
>> > --
>> > <http://ofchristonearth.wordpress.com/>
>> > S.D.G.
>>
>
>
>
> --
> Andrew Meredith
>
> Personal Blog: Soli Deo Gloria <http://kendru.wordpress.com/>
> Programming Blog <http://www.andrewmeredith.info>
>
> S.D.G.

Re: Filtering a query by range returning unexpected results

Posted by Andrew Meredith <an...@gmail.com>.
Yep, that 15.00.00 was a typo.

Here are the relevant portions of my schema.xml:

<types>
    <!-- CUT -->
    <fieldType name="currency" class="solr.CurrencyField" precisionStep="8"
defaultCurrency="USD" currencyConfig="currency.xml" />
    <!-- CUT -->
</types>

<fields>
    <!-- CUT -->
    <field name="prices" type="currency" indexed="true" stored="true"
multiValued="true" />
    <!-- CUT -->
</fields>

And here is the output of a sample query with &debugQuery=on appended:

<lst name="debug">
<str name="rawquerystring">Furtick</str>
<str name="querystring">Furtick</str>
<str name="parsedquery">
+DisjunctionMaxQuery((subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
title:furtick^2.0)) ()
</str>
<str name="parsedquery_toString">
+(subtitle:furtick | frontlist_flapcopy:furtick^0.5 |
frontlist_ean:furtick^6.0 | author:furtick^3.0 | series:furtick^1.5 |
title:furtick^2.0) ()
</str>
<lst name="explain"/>
<str name="QParser">ExtendedDismaxQParser</str>
<null name="altquerystring"/>
<null name="boostfuncs"/>
<arr name="filter_queries">
<str>prices:[5.00 TO 21.00]</str>
<str>forsaleinusa:true</str>
</arr>
<arr name="parsed_filter_queries">
<str>
ConstantScore(frange(currency(prices)):[500 TO 2100])
</str>
<str>forsaleinusa:true</str>
</arr>
<lst name="timing">
<double name="time">3.0</double>
<lst name="prepare">
<double name="time">2.0</double>
<lst name="org.apache.solr.handler.component.QueryComponent">
<double name="time">2.0</double>
</lst>
<lst name="org.apache.solr.handler.component.FacetComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.HighlightComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.StatsComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.SpellCheckComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.DebugComponent">
<double name="time">0.0</double>
</lst>
</lst>
<lst name="process">
<double name="time">1.0</double>
<lst name="org.apache.solr.handler.component.QueryComponent">
<double name="time">1.0</double>
</lst>
<lst name="org.apache.solr.handler.component.FacetComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.MoreLikeThisComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.HighlightComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.StatsComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.SpellCheckComponent">
<double name="time">0.0</double>
</lst>
<lst name="org.apache.solr.handler.component.DebugComponent">
<double name="time">0.0</double>
</lst>
</lst>
</lst>
</lst>


If I run this same query with the filter, prices:[5.00 TO 99.00], then I
get a result that includes the following field:

<arr name="prices">
<str>12.99,USD</str>
<str>14.99,USD</str>
<str>15.00,USD</str>
<str>25.00,USD</str>
</arr>


I can't figure out why this is not being returned with the first query.
I'll try re-building the index with the "prices" field type set to float
and see if that changes the behaviour.

On Sat, Jun 30, 2012 at 6:49 PM, Erick Erickson <er...@gmail.com>wrote:

> This works fine for me with 3.6, float fields and even on a currency type.
>
> I'm assuming a typo for 15.00.00 BTW.
>
> I admit I'm not all that familiar with the "currency" type, which I infer
> you're
> using given the "USD" bits. But I ran a quick test with currency types and
> it worked at least the way I ran it... But another quick look shows that
> some interesting things are being done with the "currency" type, so who
> knows?
>
> So, let's see your relevant schema bits, and the results of your query
> when you attach &debugQuery=on to it.....
>
>
> Best
> Erick
>
> On Fri, Jun 29, 2012 at 2:43 PM, Andrew Meredith <an...@gmail.com>
> wrote:
> > First off, I have to say that I am working on my first project that has
> > required me to work with Solr, so my question my be very elementary - I
> > just could not find an answer elsewhere.
> >
> > I am trying to add a ranged query filter that returns all items in a
> given
> > "prices" range. In my situation, each item can have multiple prices, so
> it
> > is a multivalued field. When I search a range, say, prices:[15.00.00 TO
> > 21.00], I want Solr to return all items that have *any* price in that
> > range, rather than returning results where *all* prices are in the range.
> > For example, if i have an item with the following prices, it will not be
> > returned:
> >   <arr name="prices">
> >   <str>19.99,USD</str>
> >   <str>22.50,USD</str>
> >   </arr>
> >
> > Is there any way to change the behaviour of Solr so that it will match
> > documents in which any value of a multivalued field matches a ranged
> query
> > filter?
> >
> > Thanks!
> >
> > --
> > <http://ofchristonearth.wordpress.com/>
> > S.D.G.
>



-- 
Andrew Meredith

Personal Blog: Soli Deo Gloria <http://kendru.wordpress.com/>
Programming Blog <http://www.andrewmeredith.info>

S.D.G.

Re: Filtering a query by range returning unexpected results

Posted by Erick Erickson <er...@gmail.com>.
This works fine for me with 3.6, float fields and even on a currency type.

I'm assuming a typo for 15.00.00 BTW.

I admit I'm not all that familiar with the "currency" type, which I infer you're
using given the "USD" bits. But I ran a quick test with currency types and
it worked at least the way I ran it... But another quick look shows that
some interesting things are being done with the "currency" type, so who knows?

So, let's see your relevant schema bits, and the results of your query
when you attach &debugQuery=on to it.....


Best
Erick

On Fri, Jun 29, 2012 at 2:43 PM, Andrew Meredith <an...@gmail.com> wrote:
> First off, I have to say that I am working on my first project that has
> required me to work with Solr, so my question my be very elementary - I
> just could not find an answer elsewhere.
>
> I am trying to add a ranged query filter that returns all items in a given
> "prices" range. In my situation, each item can have multiple prices, so it
> is a multivalued field. When I search a range, say, prices:[15.00.00 TO
> 21.00], I want Solr to return all items that have *any* price in that
> range, rather than returning results where *all* prices are in the range.
> For example, if i have an item with the following prices, it will not be
> returned:
>   <arr name="prices">
>   <str>19.99,USD</str>
>   <str>22.50,USD</str>
>   </arr>
>
> Is there any way to change the behaviour of Solr so that it will match
> documents in which any value of a multivalued field matches a ranged query
> filter?
>
> Thanks!
>
> --
> <http://ofchristonearth.wordpress.com/>
> S.D.G.