Class: Searchkick::Results
- Inherits:
-
Object
- Object
- Searchkick::Results
- Extended by:
- Forwardable
- Includes:
- Enumerable
- Defined in:
- lib/searchkick/results.rb
Instance Attribute Summary collapse
-
#klass ⇒ Object
readonly
Returns the value of attribute klass.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#response ⇒ Object
readonly
Returns the value of attribute response.
Instance Method Summary collapse
- #aggregations ⇒ Object
- #aggs ⇒ Object
- #clear_scroll ⇒ Object
- #current_page ⇒ Object
- #entry_name(options = {}) ⇒ Object
- #error ⇒ Object
- #first_page? ⇒ Boolean
- #highlights(multiple: false) ⇒ Object
- #hits ⇒ Object
-
#initialize(klass, response, options = {}) ⇒ Results
constructor
A new instance of Results.
- #last_page? ⇒ Boolean
- #missing_records ⇒ Object
- #misspellings? ⇒ Boolean
- #model_name ⇒ Object
- #next_page ⇒ Object
- #offset_value ⇒ Object (also: #offset)
- #out_of_range? ⇒ Boolean
- #padding ⇒ Object
- #per_page ⇒ Object (also: #limit_value)
- #previous_page ⇒ Object (also: #prev_page)
- #results ⇒ Object
- #scroll ⇒ Object
- #scroll_id ⇒ Object
- #suggestions ⇒ Object
- #took ⇒ Object
- #total_count ⇒ Object (also: #total_entries)
- #total_pages ⇒ Object (also: #num_pages)
-
#with_highlights(multiple: false) ⇒ Object
TODO return enumerator like with_score.
-
#with_hit ⇒ Object
TODO return enumerator like with_score.
- #with_score ⇒ Object
Constructor Details
#initialize(klass, response, options = {}) ⇒ Results
Returns a new instance of Results.
12 13 14 15 16 |
# File 'lib/searchkick/results.rb', line 12 def initialize(klass, response, = {}) @klass = klass @response = response @options = end |
Instance Attribute Details
#klass ⇒ Object (readonly)
Returns the value of attribute klass.
8 9 10 |
# File 'lib/searchkick/results.rb', line 8 def klass @klass end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
8 9 10 |
# File 'lib/searchkick/results.rb', line 8 def @options end |
#response ⇒ Object (readonly)
Returns the value of attribute response.
8 9 10 |
# File 'lib/searchkick/results.rb', line 8 def response @response end |
Instance Method Details
#aggregations ⇒ Object
46 47 48 |
# File 'lib/searchkick/results.rb', line 46 def aggregations response["aggregations"] end |
#aggs ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/searchkick/results.rb', line 50 def aggs @aggs ||= begin if aggregations aggregations.dup.each do |field, filtered_agg| buckets = filtered_agg[field] # move the buckets one level above into the field hash if buckets filtered_agg.delete(field) filtered_agg.merge!(buckets) end end end end end |
#clear_scroll ⇒ Object
204 205 206 207 208 209 210 211 212 213 |
# File 'lib/searchkick/results.rb', line 204 def clear_scroll begin # try to clear scroll # not required as scroll will expire # but there is a cost to open scrolls Searchkick.client.clear_scroll(scroll_id: scroll_id) rescue Elasticsearch::Transport::Transport::Error # do nothing end end |
#current_page ⇒ Object
98 99 100 |
# File 'lib/searchkick/results.rb', line 98 def current_page [:page] end |
#entry_name(options = {}) ⇒ Object
77 78 79 80 81 82 83 84 85 |
# File 'lib/searchkick/results.rb', line 77 def entry_name( = {}) if .empty? # backward compatibility model_name.human.downcase else default = [:count] == 1 ? model_name.human : model_name.human.pluralize model_name.human(.reverse_merge(default: default)) end end |
#error ⇒ Object
69 70 71 |
# File 'lib/searchkick/results.rb', line 69 def error response["error"] end |
#first_page? ⇒ Boolean
130 131 132 |
# File 'lib/searchkick/results.rb', line 130 def first_page? previous_page.nil? end |
#highlights(multiple: false) ⇒ Object
150 151 152 153 154 |
# File 'lib/searchkick/results.rb', line 150 def highlights(multiple: false) hits.map do |hit| hit_highlights(hit, multiple: multiple) end end |
#hits ⇒ Object
142 143 144 145 146 147 148 |
# File 'lib/searchkick/results.rb', line 142 def hits if error raise Searchkick::Error, "Query error - use the error method to view it" else @response["hits"]["hits"] end end |
#last_page? ⇒ Boolean
134 135 136 |
# File 'lib/searchkick/results.rb', line 134 def last_page? next_page.nil? end |
#missing_records ⇒ Object
32 33 34 |
# File 'lib/searchkick/results.rb', line 32 def missing_records @missing_records ||= with_hit_and_missing_records[1] end |
#misspellings? ⇒ Boolean
171 172 173 |
# File 'lib/searchkick/results.rb', line 171 def misspellings? @options[:misspellings] end |
#model_name ⇒ Object
73 74 75 |
# File 'lib/searchkick/results.rb', line 73 def model_name klass.model_name end |
#next_page ⇒ Object
126 127 128 |
# File 'lib/searchkick/results.rb', line 126 def next_page current_page < total_pages ? (current_page + 1) : nil end |
#offset_value ⇒ Object Also known as: offset
116 117 118 |
# File 'lib/searchkick/results.rb', line 116 def offset_value (current_page - 1) * per_page + padding end |
#out_of_range? ⇒ Boolean
138 139 140 |
# File 'lib/searchkick/results.rb', line 138 def out_of_range? current_page > total_pages end |
#padding ⇒ Object
107 108 109 |
# File 'lib/searchkick/results.rb', line 107 def padding [:padding] end |
#per_page ⇒ Object Also known as: limit_value
102 103 104 |
# File 'lib/searchkick/results.rb', line 102 def per_page [:per_page] end |
#previous_page ⇒ Object Also known as: prev_page
121 122 123 |
# File 'lib/searchkick/results.rb', line 121 def previous_page current_page > 1 ? (current_page - 1) : nil end |
#results ⇒ Object
18 19 20 |
# File 'lib/searchkick/results.rb', line 18 def results @results ||= with_hit.map(&:first) end |
#scroll ⇒ Object
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/searchkick/results.rb', line 179 def scroll raise Searchkick::Error, "Pass `scroll` option to the search method for scrolling" unless scroll_id if block_given? records = self while records.any? yield records records = records.scroll end records.clear_scroll else begin # TODO Active Support notifications for this scroll call Searchkick::Results.new(@klass, Searchkick.client.scroll(scroll: [:scroll], body: {scroll_id: scroll_id}), @options) rescue Elasticsearch::Transport::Transport::Errors::NotFound => e if e.class.to_s =~ /NotFound/ && e. =~ /search_context_missing_exception/i raise Searchkick::Error, "Scroll id has expired" else raise e end end end end |
#scroll_id ⇒ Object
175 176 177 |
# File 'lib/searchkick/results.rb', line 175 def scroll_id @response["_scroll_id"] end |
#suggestions ⇒ Object
36 37 38 39 40 41 42 43 44 |
# File 'lib/searchkick/results.rb', line 36 def suggestions if response["suggest"] response["suggest"].values.flat_map { |v| v.first["options"] }.sort_by { |o| -o["score"] }.map { |o| o["text"] }.uniq elsif [:suggest] || [:term] == "*" # TODO remove 2nd term [] else raise "Pass `suggest: true` to the search method for suggestions" end end |
#took ⇒ Object
65 66 67 |
# File 'lib/searchkick/results.rb', line 65 def took response["took"] end |
#total_count ⇒ Object Also known as: total_entries
87 88 89 90 91 92 93 94 95 |
# File 'lib/searchkick/results.rb', line 87 def total_count if [:total_entries] [:total_entries] elsif response["hits"]["total"].is_a?(Hash) response["hits"]["total"]["value"] else response["hits"]["total"] end end |
#total_pages ⇒ Object Also known as: num_pages
111 112 113 |
# File 'lib/searchkick/results.rb', line 111 def total_pages (total_count / per_page.to_f).ceil end |
#with_highlights(multiple: false) ⇒ Object
TODO return enumerator like with_score
157 158 159 160 161 |
# File 'lib/searchkick/results.rb', line 157 def with_highlights(multiple: false) with_hit.map do |result, hit| [result, hit_highlights(hit, multiple: multiple)] end end |
#with_hit ⇒ Object
TODO return enumerator like with_score
23 24 25 26 27 28 29 30 |
# File 'lib/searchkick/results.rb', line 23 def with_hit @with_hit ||= begin if missing_records.any? Searchkick.warn("Records in search index do not exist in database: #{missing_records.map { |v| v[:id] }.join(", ")}") end with_hit_and_missing_records[0] end end |
#with_score ⇒ Object
163 164 165 166 167 168 169 |
# File 'lib/searchkick/results.rb', line 163 def with_score return enum_for(:with_score) unless block_given? with_hit.each do |result, hit| yield result, hit["_score"] end end |