Class: Shoes::Search
Overview
require ‘ftsearchrt’
Instance Attribute Summary collapse
-
#index ⇒ Object
readonly
Returns the value of attribute index.
Instance Method Summary collapse
- #add_document(hsh) ⇒ Object
- #find_all(terms, show = 20, prob_sort = false) ⇒ Object
- #finish! ⇒ Object
-
#initialize(fields = [:uri, :body]) ⇒ Search
constructor
A new instance of Search.
Constructor Details
#initialize(fields = [:uri, :body]) ⇒ Search
Returns a new instance of Search.
8 9 10 11 12 13 14 15 |
# File 'lib/shoes/search.rb', line 8 def initialize fields = [:uri, :body] field_infos = FTSearch::FieldInfos.new fields.each do |name| field_infos.add_field :name => name, :analyzer => FTSearch::Analysis::SimpleIdentifierAnalyzer.new end @index = FTSearch::FragmentWriter.new :path => nil, :field_infos => field_infos end |
Instance Attribute Details
#index ⇒ Object (readonly)
Returns the value of attribute index.
7 8 9 |
# File 'lib/shoes/search.rb', line 7 def index @index end |
Instance Method Details
#add_document(hsh) ⇒ Object
16 17 18 |
# File 'lib/shoes/search.rb', line 16 def add_document hsh @index.add_document hsh end |
#find_all(terms, show = 20, prob_sort = false) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/shoes/search.rb', line 26 def find_all terms, show = 20, prob_sort = false h = Hash.new{|h,k| h[k] = 0} weights = Hash.new(1.0) weights[0] = 10000000 # :uri weights[1] = 10000000 # :body hits = @sa.find_all terms size = hits.size if prob_sort && size > 10000 iterations = 50 * Math.sqrt(size) offsets = @sa.lazyhits_to_offsets(hits) weight_arr = weights.sort_by{|id,w| id}.map{|_,v| v} sorted = @dm.rank_offsets_probabilistic(offsets, weight_arr, iterations) else offsets = @sa.lazyhits_to_offsets(hits) sorted = @dm.rank_offsets(offsets, weights.sort_by{|id,w| id}.map{|_,v| v}) end sorted[0..show].map do |doc_id, count| [@dm.document_id_to_uri(doc_id), count] end end |
#finish! ⇒ Object
19 20 21 22 23 24 25 |
# File 'lib/shoes/search.rb', line 19 def finish! @index.finish! @ft = FulltextReader.new :io => StringIO.new(@index.fulltext_writer.data) @sa = SuffixArrayReader.new @ft, nil, :io => StringIO.new(@index.suffix_array_writer.data) @dm = DocumentMapReader.new :io => StringIO.new(@index.doc_map_writer.data) end |