Class: Blacklight::Solr::Response::Spelling::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/blacklight/solr/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/blacklight/solr/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/blacklight/solr/response/spelling.rb', line 13

def response
  @response
end

Instance Method Details

#collationObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/blacklight/solr/response/spelling.rb', line 71

def collation
  # FIXME: DRY up with words
  spellcheck = response[:spellcheck]
  return unless spellcheck && spellcheck[:suggestions]

  suggestions = spellcheck[:suggestions]

  if suggestions.is_a?(Array) && suggestions.index("collation")
    # solr < 5 response
    suggestions[suggestions.index("collation") + 1]
  elsif spellcheck.key?("collations")
    # solr 5+ response
    spellcheck['collations'].last if spellcheck.key?("collations")
  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
# File 'lib/blacklight/solr/response/spelling.rb', line 25

def words
  @words ||= begin
    word_suggestions = []
    spellcheck = response[:spellcheck]
    if spellcheck && spellcheck[:suggestions]
      suggestions = spellcheck[:suggestions]
      unless suggestions.nil?
        if suggestions.is_a?(Array)
          # Before solr 6.5 suggestions is an array with the following format:
          #    (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)
          # We turn it into a hash here so that it is the same format as in solr 6.5 and later
          suggestions = Hash[*suggestions].except('correctlySpelled', 'collation')
        end

        suggestions.each_value do |term_info|
          # term_info is a hash:
          #   numFound =>
          #   startOffset =>
          #   endOffset =>
          #   origFreq =>
          #   suggestion =>  [{ frequency =>, word => }] # for extended results
          #   suggestion => ['word'] # for non-extended results
          orig_freq = term_info['origFreq']
          if term_info['suggestion'].first.is_a?(Hash)
            word_suggestions << term_info['suggestion'].map do |suggestion|
              suggestion['word'] if suggestion['freq'] > orig_freq
            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
end