Class: RSolr::Ext::Response::Spelling::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/rsolr-ext/response/spelling.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(response) ⇒ Base

Returns a new instance of Base.



15
16
17
# File 'lib/rsolr-ext/response/spelling.rb', line 15

def initialize(response)
  @response = response
end

Instance Attribute Details

#responseObject (readonly)

Returns the value of attribute response.



13
14
15
# File 'lib/rsolr-ext/response/spelling.rb', line 13

def response
  @response
end

Instance Method Details

#collationObject



76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/rsolr-ext/response/spelling.rb', line 76

def collation
  # FIXME: DRY up with words
  spellcheck = self.response[:spellcheck]
    if spellcheck && spellcheck[:suggestions]
      suggestions = spellcheck[:suggestions]
      unless suggestions.nil?
        if suggestions.index("collation")
          suggestions[suggestions.index("collation") + 1]
        end
      end
    end
end

#wordsObject

returns an array of spelling suggestion for specific query words, as provided in the solr response. Only includes words with higher frequency of occurrence than word in original query. can’t do a full query suggestion because we only get info for each word; combination of words may not have results. Thanks to Naomi Dushay!



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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/rsolr-ext/response/spelling.rb', line 25

def words
  @words ||= (
    word_suggestions = []
    spellcheck = self.response[:spellcheck]
    if spellcheck && spellcheck[:suggestions]
      suggestions = spellcheck[:suggestions]
      unless suggestions.nil?
        # suggestions is an array:
        #    (query term)
        #    (hash of term info and term suggestion)
        #    ...
        #    (query term)
        #    (hash of term info and term suggestion)
        #    'correctlySpelled'
        #    true/false
        #    collation
        #    (suggestion for collation)
        if suggestions.index("correctlySpelled") #if extended results
          i_stop = suggestions.index("correctlySpelled")
        elsif suggestions.index("collation")
          i_stop = suggestions.index("collation")
        else
          i_stop = suggestions.length
        end
          # step through array in 2s to get info for each term
          0.step(i_stop-1, 2) do |i|
            term = suggestions[i]
            term_info = suggestions[i+1]
            # term_info is a hash:
            #   numFound =>
            #   startOffset =>
            #   endOffset =>
            #   origFreq =>
            #   suggestion =>  [{ frequency =>, word => }] # for extended results
            #   suggestion => ['word'] # for non-extended results
            origFreq = term_info['origFreq']
            if suggestions.index("correctlySpelled")
              word_suggestions << term_info['suggestion'].map do |suggestion|
                suggestion['word'] if suggestion['freq'] > origFreq
              end
            else
              # only extended suggestions have frequency so we just return all suggestions
              word_suggestions << term_info['suggestion']
            end
          end
      end
    end
    word_suggestions.flatten.compact.uniq
  )
end