Class: Sunspot::Query::Dismax

Inherits:
Object
  • Object
show all
Defined in:
lib/sunspot/query/dismax.rb

Overview

Solr full-text queries use Solr’s DisMaxRequestHandler, a search handler designed to process user-entered phrases, and search for individual words across a union of several fields.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(keywords) ⇒ Dismax

Returns a new instance of Dismax.



12
13
14
15
16
17
18
# File 'lib/sunspot/query/dismax.rb', line 12

def initialize(keywords)
  @keywords = keywords
  @fulltext_fields = {}
  @boost_queries = []
  @boost_functions = []
  @highlights = []
end

Instance Attribute Details

#minimum_match=(value) ⇒ Object (writeonly)

Sets the attribute minimum_match

Parameters:

  • value

    the value to set the attribute minimum_match to.



10
11
12
# File 'lib/sunspot/query/dismax.rb', line 10

def minimum_match=(value)
  @minimum_match = value
end

#phrase_slop=(value) ⇒ Object (writeonly)

Sets the attribute phrase_slop

Parameters:

  • value

    the value to set the attribute phrase_slop to.



10
11
12
# File 'lib/sunspot/query/dismax.rb', line 10

def phrase_slop=(value)
  @phrase_slop = value
end

#query_phrase_slop=(value) ⇒ Object (writeonly)

Sets the attribute query_phrase_slop

Parameters:

  • value

    the value to set the attribute query_phrase_slop to.



10
11
12
# File 'lib/sunspot/query/dismax.rb', line 10

def query_phrase_slop=(value)
  @query_phrase_slop = value
end

#tie=(value) ⇒ Object (writeonly)

Sets the attribute tie

Parameters:

  • value

    the value to set the attribute tie to.



10
11
12
# File 'lib/sunspot/query/dismax.rb', line 10

def tie=(value)
  @tie = value
end

Instance Method Details

#add_boost_function(function_query) ⇒ Object

Add a boost function



82
83
84
# File 'lib/sunspot/query/dismax.rb', line 82

def add_boost_function(function_query)
  @boost_functions << function_query
end

#add_fulltext_field(field, boost = nil) ⇒ Object

Add a fulltext field to be searched, with optional boost.



89
90
91
# File 'lib/sunspot/query/dismax.rb', line 89

def add_fulltext_field(field, boost = nil)
  @fulltext_fields[field.indexed_name] = TextFieldBoost.new(field, boost)
end

#add_highlight(fields = [], options = {}) ⇒ Object

Set highlighting options for the query. If fields is empty, the Highlighting object won’t pass field names at all, which means the dismax’s :qf parameter will be used by Solr.



106
107
108
# File 'lib/sunspot/query/dismax.rb', line 106

def add_highlight(fields=[], options={})
  @highlights << Highlighting.new(fields, options)
end

#add_phrase_field(field, boost = nil) ⇒ Object

Add a phrase field for extra boost.



96
97
98
99
# File 'lib/sunspot/query/dismax.rb', line 96

def add_phrase_field(field, boost = nil)
  @phrase_fields ||= []
  @phrase_fields << TextFieldBoost.new(field, boost)
end

#create_boost_query(factor) ⇒ Object

Assign a new boost query and return it.



74
75
76
77
# File 'lib/sunspot/query/dismax.rb', line 74

def create_boost_query(factor)
  @boost_queries << boost_query = BoostQuery.new(factor)
  boost_query
end

#has_fulltext_field?(field) ⇒ Boolean

Determine if a given field is being searched. Used by DSL to avoid overwriting boost parameters when injecting defaults.

Returns:

  • (Boolean)


114
115
116
# File 'lib/sunspot/query/dismax.rb', line 114

def has_fulltext_field?(field)
  @fulltext_fields.has_key?(field.indexed_name)
end

#to_paramsObject

The query as Solr parameters



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/sunspot/query/dismax.rb', line 23

def to_params
  params = { :q => @keywords }
  params[:fl] = '* score'
  params[:qf] = @fulltext_fields.values.map { |field| field.to_boosted_field }.join(' ')
  params[:defType] = 'dismax'
  if @phrase_fields
    params[:pf] = @phrase_fields.map { |field| field.to_boosted_field }.join(' ')
  end
  unless @boost_queries.empty?
    params[:bq] = @boost_queries.map do |boost_query|
      boost_query.to_boolean_phrase
    end
  end
  unless @boost_functions.empty?
    params[:bf] = @boost_functions.map do |boost_function|
      boost_function.to_s
    end
  end
  if @minimum_match
    params[:mm] = @minimum_match
  end
  if @phrase_slop
    params[:ps] = @phrase_slop
  end
  if @query_phrase_slop
    params[:qs] = @query_phrase_slop
  end
  if @tie
    params[:tie] = @tie
  end
  @highlights.each do |highlight|
    Sunspot::Util.deep_merge!(params, highlight.to_params)
  end
  params
end

#to_subqueryObject

Serialize the query as a Solr nested subquery.



62
63
64
65
66
67
68
69
# File 'lib/sunspot/query/dismax.rb', line 62

def to_subquery
  params = self.to_params
  params.delete :defType
  params.delete :fl
  keywords = params.delete(:q)
  options = params.map { |key, value| "#{key}='#{escape_quotes(value)}'"}.join(' ')
  "_query_:\"{!dismax #{options}}#{escape_quotes(keywords)}\""
end