Lucene numeric range search with LUKE

6k views Asked by At

I have a number of numeric Lucene indexed fields:

60000
78500
105000

If I use LUKE to query for 78500 as follows:

price:78500

It returns the correct record, however if I try to return all three record as a range I get no results.

price:[60000 TO 105000]

I realise this is due to padding as numbers are treated strings by Lucene however I just wish to know what I should be putting into LUKE to return the three records.

Many thanks for any help.

4

There are 4 answers

1
Kevin On BEST ANSWER

The solution I used for this was that the values inputted for price needed to be added to the index in padded form. Then I would just query the new padded value which works great. Therefore the new values in the index were:

060000
078500
105000

This solution was tied into an Examine search issue for Umbraco so there is a thread on the Forum of how to implement a numeric based range search if anyone requires this it is located here with a walk through end to end.

Umbraco Forum Thread

2
mindas On

I assume these fields are indexed as NumericFields. The problem with them is that Lucene/Luke does not know how to parse numeric queries automatically. You need to override Lucene's QueryParser and provide your own logic how these numbers should be interpreted.

As far as I know, Luke allows sticking in your custom parser, it just need to be present in the CLASSPATH.

Have a look at this thread on Lucene mailing list:

http://mail-archives.apache.org/mod_mbox/lucene-java-user/201102.mbox/%[email protected]%3E

1
Adrian Conlon On
  1. Zero padding won't come into this particular query since all the numbers you've shown have the same number of digits
  2. The range query you've shown has too many zeros on the second part of the range
  3. So the query for the data you've shown would be price:[10500 TO 78500]

Hope this helps,

0
aloon On

If the fields are indexed as NumericField you must use "Use XML Query Parser" option in query parser tab and the 3.5 version of Luke:

https://code.google.com/p/luke/downloads/detail?name=lukeall-3.5.0.jar&can=2&q=

An example of query with a string and numeric field is:

<BooleanQuery>
<Clause fieldName="colour" occurs="must">
    <TermQuery>rojo</TermQuery>
</Clause>
<Clause fieldName="price" occurs="must">
    <NumericRangeQuery type="int" lowerTerm="4000" upperTerm="5000" />
</Clause>
</BooleanQuery>