sunspot 2.0.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/Appraisals +7 -0
- data/Gemfile +0 -2
- data/History.txt +10 -0
- data/lib/sunspot.rb +55 -17
- data/lib/sunspot/adapters.rb +68 -18
- data/lib/sunspot/batcher.rb +1 -1
- data/lib/sunspot/configuration.rb +4 -2
- data/lib/sunspot/data_extractor.rb +36 -6
- data/lib/sunspot/dsl.rb +4 -3
- data/lib/sunspot/dsl/adjustable.rb +2 -2
- data/lib/sunspot/dsl/field_query.rb +69 -16
- data/lib/sunspot/dsl/field_stats.rb +25 -0
- data/lib/sunspot/dsl/fields.rb +28 -8
- data/lib/sunspot/dsl/fulltext.rb +9 -1
- data/lib/sunspot/dsl/group.rb +118 -0
- data/lib/sunspot/dsl/paginatable.rb +4 -1
- data/lib/sunspot/dsl/scope.rb +19 -10
- data/lib/sunspot/dsl/search.rb +1 -1
- data/lib/sunspot/dsl/spellcheckable.rb +14 -0
- data/lib/sunspot/dsl/standard_query.rb +63 -35
- data/lib/sunspot/field.rb +76 -4
- data/lib/sunspot/field_factory.rb +60 -11
- data/lib/sunspot/indexer.rb +70 -18
- data/lib/sunspot/query.rb +5 -4
- data/lib/sunspot/query/abstract_field_facet.rb +0 -2
- data/lib/sunspot/query/abstract_fulltext.rb +76 -0
- data/lib/sunspot/query/abstract_json_field_facet.rb +70 -0
- data/lib/sunspot/query/bbox.rb +5 -1
- data/lib/sunspot/query/common_query.rb +31 -6
- data/lib/sunspot/query/composite_fulltext.rb +58 -8
- data/lib/sunspot/query/date_field_json_facet.rb +25 -0
- data/lib/sunspot/query/dismax.rb +25 -71
- data/lib/sunspot/query/field_json_facet.rb +19 -0
- data/lib/sunspot/query/field_list.rb +15 -0
- data/lib/sunspot/query/field_stats.rb +61 -0
- data/lib/sunspot/query/function_query.rb +1 -2
- data/lib/sunspot/query/geo.rb +1 -1
- data/lib/sunspot/query/geofilt.rb +8 -3
- data/lib/sunspot/query/group.rb +46 -0
- data/lib/sunspot/query/group_query.rb +17 -0
- data/lib/sunspot/query/join.rb +88 -0
- data/lib/sunspot/query/more_like_this.rb +1 -1
- data/lib/sunspot/query/pagination.rb +12 -4
- data/lib/sunspot/query/range_json_facet.rb +28 -0
- data/lib/sunspot/query/restriction.rb +99 -13
- data/lib/sunspot/query/sort.rb +41 -0
- data/lib/sunspot/query/sort_composite.rb +7 -0
- data/lib/sunspot/query/spellcheck.rb +19 -0
- data/lib/sunspot/query/standard_query.rb +24 -2
- data/lib/sunspot/query/text_field_boost.rb +1 -3
- data/lib/sunspot/schema.rb +12 -3
- data/lib/sunspot/search.rb +4 -2
- data/lib/sunspot/search/abstract_search.rb +93 -43
- data/lib/sunspot/search/cursor_paginated_collection.rb +32 -0
- data/lib/sunspot/search/field_facet.rb +4 -4
- data/lib/sunspot/search/field_json_facet.rb +33 -0
- data/lib/sunspot/search/field_stats.rb +21 -0
- data/lib/sunspot/search/hit.rb +6 -1
- data/lib/sunspot/search/hit_enumerable.rb +4 -1
- data/lib/sunspot/search/json_facet_row.rb +40 -0
- data/lib/sunspot/search/json_facet_stats.rb +23 -0
- data/lib/sunspot/search/paginated_collection.rb +1 -0
- data/lib/sunspot/search/query_group.rb +74 -0
- data/lib/sunspot/search/standard_search.rb +70 -3
- data/lib/sunspot/search/stats_facet.rb +25 -0
- data/lib/sunspot/search/stats_json_row.rb +82 -0
- data/lib/sunspot/search/stats_row.rb +68 -0
- data/lib/sunspot/session.rb +62 -37
- data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +6 -4
- data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +16 -8
- data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +2 -2
- data/lib/sunspot/session_proxy/retry_5xx_session_proxy.rb +1 -1
- data/lib/sunspot/session_proxy/sharding_session_proxy.rb +4 -2
- data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +1 -1
- data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +6 -4
- data/lib/sunspot/setup.rb +42 -0
- data/lib/sunspot/type.rb +20 -0
- data/lib/sunspot/util.rb +78 -14
- data/lib/sunspot/version.rb +1 -1
- data/spec/api/adapters_spec.rb +40 -15
- data/spec/api/batcher_spec.rb +15 -15
- data/spec/api/binding_spec.rb +3 -3
- data/spec/api/class_set_spec.rb +6 -6
- data/spec/api/data_extractor_spec.rb +39 -0
- data/spec/api/hit_enumerable_spec.rb +32 -9
- data/spec/api/indexer/attributes_spec.rb +35 -30
- data/spec/api/indexer/batch_spec.rb +8 -7
- data/spec/api/indexer/dynamic_fields_spec.rb +8 -8
- data/spec/api/indexer/fixed_fields_spec.rb +16 -11
- data/spec/api/indexer/fulltext_spec.rb +8 -8
- data/spec/api/indexer/removal_spec.rb +24 -14
- data/spec/api/indexer_spec.rb +2 -2
- data/spec/api/query/advanced_manipulation_examples.rb +3 -3
- data/spec/api/query/connectives_examples.rb +26 -14
- data/spec/api/query/dsl_spec.rb +24 -6
- data/spec/api/query/dynamic_fields_examples.rb +18 -18
- data/spec/api/query/faceting_examples.rb +80 -61
- data/spec/api/query/fulltext_examples.rb +194 -40
- data/spec/api/query/function_spec.rb +116 -13
- data/spec/api/query/geo_examples.rb +8 -12
- data/spec/api/query/group_spec.rb +27 -5
- data/spec/api/query/highlighting_examples.rb +26 -26
- data/spec/api/query/join_spec.rb +19 -0
- data/spec/api/query/more_like_this_spec.rb +40 -27
- data/spec/api/query/ordering_pagination_examples.rb +37 -23
- data/spec/api/query/scope_examples.rb +39 -39
- data/spec/api/query/spatial_examples.rb +3 -3
- data/spec/api/query/spellcheck_examples.rb +20 -0
- data/spec/api/query/standard_spec.rb +3 -1
- data/spec/api/query/stats_examples.rb +66 -0
- data/spec/api/query/text_field_scoping_examples.rb +5 -5
- data/spec/api/query/types_spec.rb +4 -4
- data/spec/api/search/cursor_paginated_collection_spec.rb +35 -0
- data/spec/api/search/dynamic_fields_spec.rb +4 -4
- data/spec/api/search/faceting_spec.rb +55 -52
- data/spec/api/search/highlighting_spec.rb +7 -7
- data/spec/api/search/hits_spec.rb +43 -29
- data/spec/api/search/paginated_collection_spec.rb +19 -18
- data/spec/api/search/results_spec.rb +13 -13
- data/spec/api/search/search_spec.rb +3 -3
- data/spec/api/search/stats_spec.rb +94 -0
- data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +23 -16
- data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +16 -4
- data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +10 -6
- data/spec/api/session_proxy/retry_5xx_session_proxy_spec.rb +11 -11
- data/spec/api/session_proxy/sharding_session_proxy_spec.rb +15 -14
- data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +3 -3
- data/spec/api/session_proxy/spec_helper.rb +1 -1
- data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +40 -26
- data/spec/api/session_spec.rb +78 -38
- data/spec/api/sunspot_spec.rb +7 -4
- data/spec/helpers/integration_helper.rb +11 -1
- data/spec/helpers/query_helper.rb +1 -1
- data/spec/helpers/search_helper.rb +30 -0
- data/spec/integration/atomic_updates_spec.rb +58 -0
- data/spec/integration/dynamic_fields_spec.rb +31 -20
- data/spec/integration/faceting_spec.rb +252 -39
- data/spec/integration/field_grouping_spec.rb +47 -15
- data/spec/integration/field_lists_spec.rb +57 -0
- data/spec/integration/geospatial_spec.rb +34 -8
- data/spec/integration/highlighting_spec.rb +8 -8
- data/spec/integration/indexing_spec.rb +7 -6
- data/spec/integration/join_spec.rb +45 -0
- data/spec/integration/keyword_search_spec.rb +68 -38
- data/spec/integration/local_search_spec.rb +4 -4
- data/spec/integration/more_like_this_spec.rb +7 -7
- data/spec/integration/scoped_search_spec.rb +193 -74
- data/spec/integration/spellcheck_spec.rb +119 -0
- data/spec/integration/stats_spec.rb +88 -0
- data/spec/integration/stored_fields_spec.rb +1 -1
- data/spec/integration/test_pagination.rb +4 -4
- data/spec/integration/unicode_spec.rb +1 -1
- data/spec/mocks/adapters.rb +36 -0
- data/spec/mocks/connection.rb +5 -3
- data/spec/mocks/photo.rb +32 -1
- data/spec/mocks/post.rb +18 -3
- data/spec/spec_helper.rb +13 -8
- data/sunspot.gemspec +6 -4
- data/tasks/rdoc.rake +22 -14
- metadata +101 -44
- data/lib/sunspot/dsl/field_group.rb +0 -57
- data/lib/sunspot/query/field_group.rb +0 -37
data/lib/sunspot/query/sort.rb
CHANGED
@@ -114,6 +114,47 @@ module Sunspot
|
|
114
114
|
"geodist(#{@field.indexed_name.to_sym},#{@lat},#{@lon}) #{direction_for_solr}"
|
115
115
|
end
|
116
116
|
end
|
117
|
+
|
118
|
+
class SolrIdSort < Abstract
|
119
|
+
def to_param
|
120
|
+
"id #{direction_for_solr}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# A FunctionSort sorts by solr function.
|
126
|
+
# FunctionComp recursively parses arguments for nesting
|
127
|
+
#
|
128
|
+
class FunctionSort < Abstract
|
129
|
+
attr_reader :comp
|
130
|
+
def initialize(setup,args)
|
131
|
+
@direction = args.pop
|
132
|
+
@comp = FunctionComp.new(setup,args)
|
133
|
+
end
|
134
|
+
def to_param
|
135
|
+
"#{comp.to_s} #{direction_for_solr}"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
class FunctionComp
|
139
|
+
attr_accessor :function,:fields
|
140
|
+
def initialize(setup,args)
|
141
|
+
@function=args.shift
|
142
|
+
@fields = []
|
143
|
+
args.each do |argument|
|
144
|
+
case argument.class.name
|
145
|
+
when "Array"
|
146
|
+
@fields<< FunctionComp.new(setup,argument)
|
147
|
+
when "Symbol"
|
148
|
+
@fields<< setup.field(argument).indexed_name
|
149
|
+
else
|
150
|
+
@fields<< argument
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
def to_s
|
155
|
+
"#{function}(#{fields.map(&:to_s).join(",")})"
|
156
|
+
end
|
157
|
+
end
|
117
158
|
end
|
118
159
|
end
|
119
160
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Sunspot
|
2
|
+
module Query
|
3
|
+
class Spellcheck < Connective::Conjunction
|
4
|
+
attr_accessor :options
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_params
|
11
|
+
options = {}
|
12
|
+
@options.each do |key, val|
|
13
|
+
options["spellcheck." + Sunspot::Util.method_case(key.to_s)] = val
|
14
|
+
end
|
15
|
+
{ :spellcheck => true }.merge(options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -5,11 +5,33 @@ module Sunspot
|
|
5
5
|
|
6
6
|
def initialize(types)
|
7
7
|
super
|
8
|
-
@components << @fulltext =
|
8
|
+
@components << @fulltext = Conjunction.new
|
9
9
|
end
|
10
10
|
|
11
11
|
def add_fulltext(keywords)
|
12
|
-
@fulltext.
|
12
|
+
@fulltext.add_fulltext(keywords)
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_join(keywords, target, from, to)
|
16
|
+
@fulltext.add_join(keywords, target, from, to)
|
17
|
+
end
|
18
|
+
|
19
|
+
def disjunction
|
20
|
+
parent_fulltext = @fulltext
|
21
|
+
@fulltext = @fulltext.add_disjunction
|
22
|
+
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
@fulltext = parent_fulltext
|
26
|
+
end
|
27
|
+
|
28
|
+
def conjunction
|
29
|
+
parent_fulltext = @fulltext
|
30
|
+
@fulltext = @fulltext.add_conjunction
|
31
|
+
|
32
|
+
yield
|
33
|
+
ensure
|
34
|
+
@fulltext = parent_fulltext
|
13
35
|
end
|
14
36
|
end
|
15
37
|
end
|
data/lib/sunspot/schema.rb
CHANGED
@@ -23,7 +23,8 @@ module Sunspot
|
|
23
23
|
FieldType.new('slong', 'SortableLong', 'l'),
|
24
24
|
FieldType.new('tint', 'TrieInteger', 'it'),
|
25
25
|
FieldType.new('tfloat', 'TrieFloat', 'ft'),
|
26
|
-
FieldType.new('tdate', 'TrieInt', 'dt')
|
26
|
+
FieldType.new('tdate', 'TrieInt', 'dt'),
|
27
|
+
FieldType.new('daterange', 'DateRange', 'dr')
|
27
28
|
|
28
29
|
]
|
29
30
|
|
@@ -87,8 +88,16 @@ module Sunspot
|
|
87
88
|
# Return an XML representation of this schema using the ERB template
|
88
89
|
#
|
89
90
|
def to_xml
|
90
|
-
|
91
|
-
|
91
|
+
template_path = File.join(File.dirname(__FILE__), '..', '..', 'templates', 'schema.xml.erb')
|
92
|
+
template_text = File.read(template_path)
|
93
|
+
|
94
|
+
erb = if RUBY_VERSION >= '2.6'
|
95
|
+
ERB.new(template_text, trim_mode: '-')
|
96
|
+
else
|
97
|
+
ERB.new(template_text, nil, '-')
|
98
|
+
end
|
99
|
+
|
100
|
+
erb.result(binding)
|
92
101
|
end
|
93
102
|
|
94
103
|
private
|
data/lib/sunspot/search.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
%w(abstract_search standard_search more_like_this_search query_facet
|
2
|
-
date_facet range_facet
|
1
|
+
%w(abstract_search standard_search more_like_this_search query_facet
|
2
|
+
field_facet field_json_facet date_facet range_facet json_facet_stats
|
3
|
+
facet_row json_facet_row hit highlight field_group group hit_enumerable
|
4
|
+
stats_row stats_json_row field_stats stats_facet query_group).each do |file|
|
3
5
|
require File.join(File.dirname(__FILE__), 'search', file)
|
4
6
|
end
|
5
7
|
|
@@ -1,17 +1,18 @@
|
|
1
1
|
require 'sunspot/search/paginated_collection'
|
2
|
+
require 'sunspot/search/cursor_paginated_collection'
|
2
3
|
require 'sunspot/search/hit_enumerable'
|
3
4
|
|
4
5
|
module Sunspot
|
5
6
|
module Search #:nodoc:
|
6
|
-
|
7
|
-
#
|
7
|
+
|
8
|
+
#
|
8
9
|
# This class encapsulates the results of a Solr search. It provides access
|
9
10
|
# to search results, total result count, facets, and pagination information.
|
10
11
|
# Instances of Search are returned by the Sunspot.search and
|
11
12
|
# Sunspot.new_search methods.
|
12
13
|
#
|
13
14
|
class AbstractSearch
|
14
|
-
#
|
15
|
+
#
|
15
16
|
# Retrieve all facet objects defined for this search, in order they were
|
16
17
|
# defined. To retrieve an individual facet by name, use #facet()
|
17
18
|
#
|
@@ -20,7 +21,7 @@ module Sunspot
|
|
20
21
|
attr_accessor :request_handler
|
21
22
|
|
22
23
|
include HitEnumerable
|
23
|
-
|
24
|
+
|
24
25
|
def initialize(connection, setup, query, configuration) #:nodoc:
|
25
26
|
@connection, @setup, @query = connection, setup, query
|
26
27
|
@query.paginate(1, configuration.pagination.default_per_page)
|
@@ -30,8 +31,11 @@ module Sunspot
|
|
30
31
|
|
31
32
|
@groups_by_name = {}
|
32
33
|
@groups = []
|
34
|
+
|
35
|
+
@stats_by_name = {}
|
36
|
+
@stats = []
|
33
37
|
end
|
34
|
-
|
38
|
+
|
35
39
|
#
|
36
40
|
# Execute the search on the Solr instance and store the results. If you
|
37
41
|
# use Sunspot#search() to construct your searches, there is no need to call
|
@@ -49,8 +53,8 @@ module Sunspot
|
|
49
53
|
def execute! #:nodoc: deprecated
|
50
54
|
execute
|
51
55
|
end
|
52
|
-
|
53
|
-
#
|
56
|
+
|
57
|
+
#
|
54
58
|
# Get the collection of results as instantiated objects. If WillPaginate is
|
55
59
|
# available, the results will be a WillPaginate::Collection instance; if
|
56
60
|
# not, it will be a vanilla Array.
|
@@ -65,8 +69,8 @@ module Sunspot
|
|
65
69
|
def results
|
66
70
|
@results ||= paginate_collection(verified_hits.map { |hit| hit.instance })
|
67
71
|
end
|
68
|
-
|
69
|
-
#
|
72
|
+
|
73
|
+
#
|
70
74
|
# Access raw Solr result information. Returns a collection of Hit objects
|
71
75
|
# that contain the class name, primary key, keyword relevance score (if
|
72
76
|
# applicable), and any stored fields.
|
@@ -92,7 +96,7 @@ module Sunspot
|
|
92
96
|
end
|
93
97
|
alias_method :raw_results, :hits
|
94
98
|
|
95
|
-
#
|
99
|
+
#
|
96
100
|
# The total number of documents matching the query parameters
|
97
101
|
#
|
98
102
|
# ==== Returns
|
@@ -102,8 +106,8 @@ module Sunspot
|
|
102
106
|
def total
|
103
107
|
@total ||= solr_response['numFound'] || 0
|
104
108
|
end
|
105
|
-
|
106
|
-
#
|
109
|
+
|
110
|
+
#
|
107
111
|
# The time elapsed to generate the Solr response
|
108
112
|
#
|
109
113
|
# ==== Returns
|
@@ -113,8 +117,8 @@ module Sunspot
|
|
113
117
|
def query_time
|
114
118
|
@query_time ||= solr_response_header['QTime']
|
115
119
|
end
|
116
|
-
|
117
|
-
#
|
120
|
+
|
121
|
+
#
|
118
122
|
# Get the facet object for the given name. `name` can either be the name
|
119
123
|
# given to a query facet, or the field name of a field facet. Returns a
|
120
124
|
# Sunspot::Facet object.
|
@@ -156,11 +160,19 @@ module Sunspot
|
|
156
160
|
#
|
157
161
|
def facet(name, dynamic_name = nil)
|
158
162
|
if name
|
159
|
-
if dynamic_name
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
163
|
+
facet_name = if dynamic_name
|
164
|
+
separator = @setup.dynamic_field_factory(name).separator
|
165
|
+
[name, dynamic_name].join(separator)
|
166
|
+
else
|
167
|
+
name
|
168
|
+
end.to_sym
|
169
|
+
@facets_by_name[facet_name]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def stats(name)
|
174
|
+
if name
|
175
|
+
@stats_by_name[name.to_sym]
|
164
176
|
end
|
165
177
|
end
|
166
178
|
|
@@ -169,23 +181,35 @@ module Sunspot
|
|
169
181
|
@groups_by_name[name.to_sym]
|
170
182
|
end
|
171
183
|
end
|
172
|
-
|
173
|
-
|
184
|
+
|
185
|
+
def json_facet_stats(name, options = {})
|
186
|
+
JsonFacetStats.new(name, self, options)
|
187
|
+
end
|
188
|
+
|
189
|
+
#
|
174
190
|
# Deprecated in favor of optional second argument to #facet
|
175
191
|
#
|
176
192
|
def dynamic_facet(base_name, dynamic_name) #:nodoc:
|
177
193
|
facet(base_name, dynamic_name)
|
178
194
|
end
|
179
|
-
|
195
|
+
|
180
196
|
def facet_response #:nodoc:
|
181
197
|
@solr_result['facet_counts']
|
182
198
|
end
|
183
199
|
|
200
|
+
def json_facet_response #:nodoc:
|
201
|
+
@solr_result['facets']
|
202
|
+
end
|
203
|
+
|
204
|
+
def stats_response #:nodoc:
|
205
|
+
@solr_result['stats']['stats_fields']
|
206
|
+
end
|
207
|
+
|
184
208
|
def group_response #:nodoc:
|
185
209
|
@solr_result['grouped']
|
186
210
|
end
|
187
|
-
|
188
|
-
#
|
211
|
+
|
212
|
+
#
|
189
213
|
# Build this search using a DSL block. This method can be called more than
|
190
214
|
# once on an unexecuted search (e.g., Sunspot.new_search) in order to build
|
191
215
|
# a search incrementally.
|
@@ -202,25 +226,29 @@ module Sunspot
|
|
202
226
|
Util.instance_eval_or_call(dsl, &block)
|
203
227
|
self
|
204
228
|
end
|
205
|
-
|
206
|
-
|
229
|
+
|
230
|
+
|
207
231
|
def inspect #:nodoc:
|
208
232
|
"<Sunspot::Search:#{query.to_params.inspect}>"
|
209
233
|
end
|
210
234
|
|
211
|
-
def
|
212
|
-
|
235
|
+
def add_group(group) #:nodoc:
|
236
|
+
group.fields.each do |field|
|
237
|
+
add_subgroup(field.name, FieldGroup.new(field, self))
|
238
|
+
end
|
239
|
+
|
240
|
+
add_subgroup(:queries, QueryGroup.new(group.queries, self)) if group.queries.any?
|
213
241
|
end
|
214
|
-
|
242
|
+
|
215
243
|
def add_field_facet(field, options = {}) #:nodoc:
|
216
244
|
name = (options[:name] || field.name)
|
217
245
|
add_facet(name, FieldFacet.new(field, self, options))
|
218
246
|
end
|
219
|
-
|
247
|
+
|
220
248
|
def add_query_facet(name, options) #:nodoc:
|
221
249
|
add_facet(name, QueryFacet.new(name, self, options))
|
222
250
|
end
|
223
|
-
|
251
|
+
|
224
252
|
def add_date_facet(field, options) #:nodoc:
|
225
253
|
name = (options[:name] || field.name)
|
226
254
|
add_facet(name, DateFacet.new(field, self, options))
|
@@ -231,26 +259,35 @@ module Sunspot
|
|
231
259
|
add_facet(name, RangeFacet.new(field, self, options))
|
232
260
|
end
|
233
261
|
|
262
|
+
def add_field_stats(field) #:nodoc:
|
263
|
+
add_stats(field.name, FieldStats.new(field, self))
|
264
|
+
end
|
265
|
+
|
266
|
+
def add_json_facet(field, options = {})
|
267
|
+
name = (options[:name] || field.name)
|
268
|
+
add_facet(name, FieldJsonFacet.new(field, self, options))
|
269
|
+
end
|
270
|
+
|
234
271
|
def highlights_for(doc) #:nodoc:
|
235
272
|
if @solr_result['highlighting']
|
236
273
|
@solr_result['highlighting'][doc['id']]
|
237
274
|
end
|
238
275
|
end
|
239
|
-
|
276
|
+
|
240
277
|
private
|
241
|
-
|
278
|
+
|
242
279
|
def dsl
|
243
|
-
raise NotImplementedError
|
280
|
+
raise NotImplementedError
|
244
281
|
end
|
245
|
-
|
282
|
+
|
246
283
|
def execute_request(params)
|
247
284
|
raise NotImplementedError
|
248
285
|
end
|
249
|
-
|
286
|
+
|
250
287
|
def solr_response
|
251
288
|
@solr_response ||= @solr_result['response'] || {}
|
252
289
|
end
|
253
|
-
|
290
|
+
|
254
291
|
def solr_response_header
|
255
292
|
@solr_response_header ||= @solr_result['responseHeader'] || {}
|
256
293
|
end
|
@@ -258,25 +295,38 @@ module Sunspot
|
|
258
295
|
def solr_docs
|
259
296
|
solr_response['docs']
|
260
297
|
end
|
261
|
-
|
298
|
+
|
299
|
+
def next_cursor
|
300
|
+
@solr_result['nextCursorMark'] if @query.cursor
|
301
|
+
end
|
302
|
+
|
262
303
|
def verified_hits
|
263
304
|
@verified_hits ||= paginate_collection(super)
|
264
305
|
end
|
265
|
-
|
306
|
+
|
266
307
|
def paginate_collection(collection)
|
267
|
-
|
308
|
+
if @query.cursor
|
309
|
+
CursorPaginatedCollection.new(collection, @query.per_page, total, @query.cursor, next_cursor)
|
310
|
+
else
|
311
|
+
PaginatedCollection.new(collection, @query.page, @query.per_page, total)
|
312
|
+
end
|
268
313
|
end
|
269
|
-
|
314
|
+
|
270
315
|
def add_facet(name, facet)
|
271
316
|
@facets << facet
|
272
317
|
@facets_by_name[name.to_sym] = facet
|
273
318
|
end
|
274
319
|
|
275
|
-
def
|
320
|
+
def add_stats(name, stats)
|
321
|
+
@stats << stats
|
322
|
+
@stats_by_name[name.to_sym] = stats
|
323
|
+
end
|
324
|
+
|
325
|
+
def add_subgroup(name, group)
|
276
326
|
@groups << group
|
277
327
|
@groups_by_name[name.to_sym] = group
|
278
328
|
end
|
279
|
-
|
329
|
+
|
280
330
|
# Clear out all the cached ivars so the search can be called again.
|
281
331
|
def reset
|
282
332
|
@results = @hits = @verified_hits = @total = @solr_response = @doc_ids = nil
|