Class: Ferret::Search::MultiTermQuery

Inherits:
Query
  • Object
show all
Defined in:
lib/ferret/search/multi_term_query.rb

Overview

A Query that matches documents containing a subset of terms provided by a FilteredTermEnum enumeration.

MultiTermQuery is not designed to be used by itself. The reason being that it is not intialized with a FilteredTermEnum enumeration. A FilteredTermEnum enumeration needs to be provided.

For example, WildcardQuery and FuzzyQuery extend MultiTermQuery to provide WildcardTermEnum and FuzzyTermEnum, respectively.

Direct Known Subclasses

FuzzyQuery, WildcardQuery

Instance Attribute Summary collapse

Attributes inherited from Query

#boost

Instance Method Summary collapse

Methods inherited from Query

#combine, #create_weight, #extract_terms, #merge_boolean_queries, #similarity, #weight

Constructor Details

#initialize(term) ⇒ MultiTermQuery

Constructs a query for terms matching term.



15
16
17
18
# File 'lib/ferret/search/multi_term_query.rb', line 15

def initialize(term) 
  super()
  @term = term
end

Instance Attribute Details

#termObject (readonly)

Returns the value of attribute term.



12
13
14
# File 'lib/ferret/search/multi_term_query.rb', line 12

def term
  @term
end

Instance Method Details

#eql?(o) ⇒ Boolean Also known as: ==

Returns:

  • (Boolean)


53
54
55
56
57
58
# File 'lib/ferret/search/multi_term_query.rb', line 53

def eql?(o) 
  if not o.instance_of? MultiTermQuery
    return false
  end
  return term == o.term
end

#get_term_enum(reader) ⇒ Object

Construct the enumeration to be used, expanding the pattern term.

Raises:

  • (NotImplementedError)


21
22
23
# File 'lib/ferret/search/multi_term_query.rb', line 21

def get_term_enum(reader)
  raise NotImplementedError
end

#hashObject



61
62
63
# File 'lib/ferret/search/multi_term_query.rb', line 61

def hash() 
  return term.hash()
end

#rewrite(reader) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/ferret/search/multi_term_query.rb', line 26

def rewrite(reader)
  enumerator = get_term_enum(reader)
  bq = BooleanQuery.new(true)
  begin 
    begin 
      t = enumerator.term()
      if (t != nil)
        tq = TermQuery.new(t)      # found a match
        tq.boost = boost() * enumerator.difference()   # set the boost
        bq.add_query(tq, BooleanClause::Occur::SHOULD) # add to query
      end
    end while enumerator.next?
  ensure 
    enumerator.close()
  end
  return bq
end

#to_s(field = nil) ⇒ Object

Prints a user-readable version of this query.



45
46
47
48
49
50
51
# File 'lib/ferret/search/multi_term_query.rb', line 45

def to_s(field = nil) 
  buffer = ""
  buffer << "#{@term.field}:" if @term.field != field
  buffer << @term.text
  buffer << "^#{boost()}" if (boost() != 1.0) 
  return buffer
end