class SuperSearch::Scroll
Attributes
expire_time[RW]
query[RW]
size[RW]
Public Class Methods
new(model, term: '*', options: {})
click to toggle source
ScrollSearch.new(Member, '*', where: {}, order: {}, scroll: '5m', size: 10000)
# File lib/super_search/scroll.rb, line 7 def initialize(model, term: '*', options: {}) self.expire_time = options.delete(:scroll) || '5m' # 單次筆數不得超過 10000 self.size = options.delete(:size).to_i # TODO: 這裏多搜尋一次,解決效能問題 searchkick = model.search(term, { execute: false }.merge(options)) self.query = Searchkick::Query.new(searchkick.klass, searchkick.term, searchkick.options) query_inject_hack query.setup_scroll(expire_time) query.setup_size(size) end
Public Instance Methods
execute()
click to toggle source
searchkick/query line: 78
Calls superclass method
# File lib/super_search/scroll.rb, line 43 def execute @execute = nil super end
execute_search()
click to toggle source
searchkick/query line: 205
# File lib/super_search/scroll.rb, line 56 def execute_search # 第一次用原本的 search 來取 scroll id, 第二次以後 scroll id 跑 scroll api if @scroll_id.present? Searchkick.client.scroll(body: { scroll_id: @scroll_id }, scroll: @scroll) else Searchkick.client.search(params) end end
handle_response(response)
click to toggle source
searchkick/query line: 104
Calls superclass method
# File lib/super_search/scroll.rb, line 49 def handle_response(response) # 從 response 設定 scroll ID @scroll_id = response['_scroll_id'] super end
params()
click to toggle source
searchkick/query line: 58
Calls superclass method
# File lib/super_search/scroll.rb, line 36 def params options = { scroll: @scroll } options.merge!(body: { size: @size }) if @size <= 10000 && @size > 0 super.deep_merge(options) end
query_inject_hack()
click to toggle source
(hack) 改裝 Searchkick::Query
# File lib/super_search/scroll.rb, line 22 def query_inject_hack query.instance_eval do # 設定遍歷參數 def setup_scroll(scroll) @scroll_id = nil @scroll = scroll end # 設定遍歷 筆數/次 def setup_size(size) @size = size end # searchkick/query line: 58 def params options = { scroll: @scroll } options.merge!(body: { size: @size }) if @size <= 10000 && @size > 0 super.deep_merge(options) end # searchkick/query line: 78 def execute @execute = nil super end # searchkick/query line: 104 def handle_response(response) # 從 response 設定 scroll ID @scroll_id = response['_scroll_id'] super end # searchkick/query line: 205 def execute_search # 第一次用原本的 search 來取 scroll id, 第二次以後 scroll id 跑 scroll api if @scroll_id.present? Searchkick.client.scroll(body: { scroll_id: @scroll_id }, scroll: @scroll) else Searchkick.client.search(params) end end end end
search(&block)
click to toggle source
開始遍歷搜尋
# File lib/super_search/scroll.rb, line 68 def search(&block) while r = query.execute and not r.response['hits']['hits'].empty? do block.call(r.results, r.total_count) if block end end
setup_scroll(scroll)
click to toggle source
設定遍歷參數
# File lib/super_search/scroll.rb, line 25 def setup_scroll(scroll) @scroll_id = nil @scroll = scroll end
setup_size(size)
click to toggle source
設定遍歷 筆數/次
# File lib/super_search/scroll.rb, line 31 def setup_size(size) @size = size end