64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/tanker.rb', line 64
def search(models, query, options = {})
ids = []
models = [models].flatten.uniq
index = models.first.tanker_index
query = query.join(' ') if Array === query
snippets = options.delete(:snippets)
fetch = options.delete(:fetch)
paginate = (options, :page => 1, :per_page => models.first.per_page)
if (index_names = models.map(&:tanker_config).map(&:index_name).uniq).size > 1
raise "You can't search across multiple indexes in one call (#{index_names.inspect})"
end
if conditions = options.delete(:conditions)
conditions.each do |field, value|
value = [value].flatten.compact
value.each do |item|
query += " #{field}:(#{item})"
end
end
end
if filter_functions = options.delete(:filter_functions)
filter_functions.each do |function_number, ranges|
options[:"filter_function#{function_number}"] = ranges.map{|r|r.join(':')}.join(',')
end
end
if filter_docvars = options.delete(:filter_docvars)
filter_docvars.each do |var_number, ranges|
options[:"filter_docvar#{var_number}"] = ranges.map{|r|r.join(':')}.join(',')
end
end
options[:fetch] = "__type,__id"
options[:fetch] += ",#{fetch.join(',')}" if fetch
options[:snippet] = snippets.join(',') if snippets
options[:category_filters] = options[:category_filters].to_json if options[:category_filters]
search_on_fields = models.map{|model| model.tanker_config.indexes.map{|arr| arr[0]}.uniq}.flatten.uniq.join(":(#{query.to_s}) OR ")
query = "(#{search_on_fields}:(#{query.to_s}) OR __any:(#{query.to_s})) __type:(#{models.map(&:name).map {|name| "\"#{name.split('::').join(' ')}\"" }.join(' OR ')})"
options = { :start => paginate[:per_page] * (paginate[:page] - 1), :len => paginate[:per_page] }.merge(options) if paginate
results = index.search(query, options)
categories = results['facets'] if results.has_key?('facets')
instantiated_results = if (fetch || snippets)
instantiate_results_from_results(results, fetch, snippets)
else
instantiate_results_from_db(results)
end
paginate === false ? instantiated_results : Pagination.create(instantiated_results, results['matches'], paginate, categories)
end
|