To answer my own questions, the problem I had was that I didn't pad 
zeros in my query as the same way as in the IntegerAnalyzer.

# rip from the "Ferret" ebook at 
http://www.oreilly.com/catalog/9780596527853/index.html

module Ferret::Analysis
# range comparision is done by lexical order, not numeric order
  class IntegerTokenizer
    def initialize(num, width)
      @num = num.to_i
      @width = width
    end
    def next
      token = Token.new("[EMAIL PROTECTED]" % @num, 0, @width) if @num
      @num = nil
      return token
    end
    def text=(text)
      @num = text.to_i
    end

    end
      class IntegerAnalyzer
        def initialize(width)
          @width = width
        end
        def token_stream(field, input)
          return IntegerTokenizer.new(input, @width)
        end
      end
end


include Ferret::Analysis

analyzer = PerFieldAnalyzer.new(StandardAnalyzer.new)
# "num" is the name of the field which to use this analyzer
analyzer[:num] = IntegerAnalyzer.new(3)

index = Ferret::Index::Index.new(:analyzer => analyzer)

docs = [
{:num => 5},
{:num => 15},
{:num => 30}
]

docs.each { |d| index << d }

>> puts index.search('num:[001 020]')
TopDocs: total_hits = 2, max_score = 1.000000 [
        0 "": 1.000000
        1 "": 1.000000
]
=> nil
>>
?> puts index.search('num:[010 100]')
TopDocs: total_hits = 2, max_score = 1.000000 [
        1 "": 1.000000
        2 "": 1.000000
]



Yaxm Yaxm wrote:
> Hi,
> it looks like Ferret still compares numeric fields by lexical ordering,
> not numerical ordering.  I am using Ferret 0.11.4(I tried in both linux
> and windows, the results are the same).
> 
> 
> index = Ferret::Index::Index.new()
> docs = [
> {:num => 1,    :data => "yes"},
> {:num => 1,    :data => "no"},
> {:num => 10,   :data => "yes"},
> {:num => 10,   :data => "no"},
> {:num => 100,  :data => "yes"},
> {:num => 100,  :data => "no"},
> {:num => 1000, :data => "yes"},
> {:num => 1000, :data => "no"}
> ]
> 
> ?>     puts index.process_query('data:yes AND num:[10 100]')
> +data:yes +num:[10 100]
> => nil
>>>     puts index.search('d:data:yes AND num:[10 100]')
> TopDocs: total_hits = 2, max_score = 1.777895 [
>         2 "": 1.777895
>         4 "": 1.777895
> ]
> => nil
>>>     puts index.process_query('data:yes AND num:[2 100]')
> num:"data yes <> num 2 100"~4
> => nil
>>>     puts index.process_query('num:[2 100]')
> num:"num 2 100"~2
> => nil
>>>     puts index.search('num:[2 100]')
> TopDocs: total_hits = 0, max_score = 0.000000 [
> ]
> => nil
>>>     puts index.process_query('num:>2')
> num:{2>
> => nil
>>>     puts index.search('num:>2')
> TopDocs: total_hits = 0, max_score = 0.000000 [
> ]
> => nil
> 
> 
> According to the release note for Ferret 0.10.6 at
> http://rubyforge.org/forum/forum.php?forum_id=9058, "Range queries just
> work. No need to pad numbers or format dates correctly."
> 
> Is this a new bug?
> 
> Thanks.
> Yaxm


-- 
Posted via http://www.ruby-forum.com/.
_______________________________________________
Ferret-talk mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/ferret-talk

Reply via email to