sunspot 0.10.8 → 0.10.9
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +18 -7
- data/TODO +8 -0
- data/VERSION.yml +3 -2
- data/lib/sunspot/search/hit.rb +9 -0
- data/lib/sunspot/search.rb +20 -11
- data/spec/api/search/highlighting_spec.rb +7 -3
- data/spec/api/search/hits_spec.rb +18 -0
- data/tasks/gemspec.rake +1 -1
- data/tasks/rdoc.rake +1 -1
- metadata +48 -48
data/README.rdoc
CHANGED
@@ -107,13 +107,24 @@ to define your own. See Sunspot::Adapters for more information.
|
|
107
107
|
|
108
108
|
See Sunspot.search for more information.
|
109
109
|
|
110
|
-
===
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
110
|
+
=== Work with search results (Haml for readability):
|
111
|
+
|
112
|
+
.facets
|
113
|
+
ul.blog_facet
|
114
|
+
- @search.facet(:blog_id).rows.each do |row|
|
115
|
+
li.facet_row
|
116
|
+
= link_to(row.instance.name, params.merge(:blog_id => row.value))
|
117
|
+
%span.count== (#{row.count})
|
118
|
+
.page_info== Displaying page #{@search.page} of #{@search.per_page} out of #{@search.total} results
|
119
|
+
- @search.hits.each do |hit|
|
120
|
+
- post = hit.result
|
121
|
+
.search_result
|
122
|
+
%h3.title
|
123
|
+
= link_to(h(hit.stored(:title)), post_url(post))
|
124
|
+
- if hit.score
|
125
|
+
%span.relevance== (#{hit.score})
|
126
|
+
%p= hit.highlight(:description).format { |word| "<span class=\"highlight\">#{word}</span>" }
|
127
|
+
.pagination= will_paginate(search.hits)
|
117
128
|
|
118
129
|
== About the API documentation
|
119
130
|
|
data/TODO
CHANGED
@@ -1,7 +1,15 @@
|
|
1
|
+
<<<<<<< HEAD:TODO
|
1
2
|
=== 0.10.x ===
|
2
3
|
* Can retrieve facets from search via string
|
3
4
|
* Allow #latitude and #longitude as coordinate attributes
|
4
5
|
* Allow use of #text_fields from inside disjunction
|
6
|
+
=======
|
7
|
+
=== 1.0 ===
|
8
|
+
* Built-in session proxies; #thread_local_sessions! method
|
9
|
+
* Support 1.4, retaining 1.3 support if/as much as possible
|
10
|
+
* Working local + keyword search
|
11
|
+
* Facet filter exclusion
|
12
|
+
>>>>>>> d8e4337... Minor API & documentation improvements:TODO
|
5
13
|
|
6
14
|
* Assumed inconsistency
|
7
15
|
* Support all operations in batches. Make it smart.
|
data/VERSION.yml
CHANGED
data/lib/sunspot/search/hit.rb
CHANGED
@@ -52,6 +52,14 @@ module Sunspot
|
|
52
52
|
end || []
|
53
53
|
end
|
54
54
|
|
55
|
+
#
|
56
|
+
# Return the first highlight found for a given field, or nil if there is
|
57
|
+
# none.
|
58
|
+
#
|
59
|
+
def highlight(field_name)
|
60
|
+
highlights(field_name).first
|
61
|
+
end
|
62
|
+
|
55
63
|
#
|
56
64
|
# Retrieve stored field value. For any attribute field configured with
|
57
65
|
# :stored => true, the Hit object will contain the stored value for
|
@@ -78,6 +86,7 @@ module Sunspot
|
|
78
86
|
end
|
79
87
|
@instance
|
80
88
|
end
|
89
|
+
alias_method :result, :instance
|
81
90
|
|
82
91
|
def inspect #:nodoc:
|
83
92
|
"#<Sunspot::Search::Hit:#{@class_name} #{@primary_key}>"
|
data/lib/sunspot/search.rb
CHANGED
@@ -48,13 +48,7 @@ module Sunspot
|
|
48
48
|
# WillPaginate::Collection or Array:: Instantiated result objects
|
49
49
|
#
|
50
50
|
def results
|
51
|
-
@results ||=
|
52
|
-
WillPaginate::Collection.create(@query.page, @query.per_page, total) do |pager|
|
53
|
-
pager.replace(hits.map { |hit| hit.instance })
|
54
|
-
end
|
55
|
-
else
|
56
|
-
hits.map { |hit| hit.instance }
|
57
|
-
end
|
51
|
+
@results ||= maybe_will_paginate(hits.map { |hit| hit.instance })
|
58
52
|
end
|
59
53
|
|
60
54
|
#
|
@@ -67,7 +61,12 @@ module Sunspot
|
|
67
61
|
# Array:: Ordered collection of Hit objects
|
68
62
|
#
|
69
63
|
def hits
|
70
|
-
@hits ||=
|
64
|
+
@hits ||=
|
65
|
+
maybe_will_paginate(
|
66
|
+
solr_response['docs'].map do |doc|
|
67
|
+
Hit.new(doc, highlights_for(doc), self)
|
68
|
+
end
|
69
|
+
)
|
71
70
|
end
|
72
71
|
alias_method :raw_results, :hits
|
73
72
|
|
@@ -165,9 +164,9 @@ module Sunspot
|
|
165
164
|
end
|
166
165
|
id_hit_hash.each_pair do |class_name, hits|
|
167
166
|
ids = hits.map { |id, hit| hit.primary_key }
|
168
|
-
data_accessor_for(Util.full_const_get(class_name)).load_all(ids).each do |
|
169
|
-
hit = id_hit_hash[class_name][Adapters::InstanceAdapter.adapt(
|
170
|
-
hit.instance =
|
167
|
+
data_accessor_for(Util.full_const_get(class_name)).load_all(ids).each do |result|
|
168
|
+
hit = id_hit_hash[class_name][Adapters::InstanceAdapter.adapt(result).id.to_s]
|
169
|
+
hit.instance = result
|
171
170
|
end
|
172
171
|
end
|
173
172
|
end
|
@@ -207,6 +206,16 @@ module Sunspot
|
|
207
206
|
@solr_result['highlighting'][doc['id']]
|
208
207
|
end
|
209
208
|
end
|
209
|
+
|
210
|
+
def maybe_will_paginate(collection)
|
211
|
+
if defined?(WillPaginate::Collection)
|
212
|
+
WillPaginate::Collection.create(@query.page, @query.per_page, total) do |pager|
|
213
|
+
pager.replace(collection)
|
214
|
+
end
|
215
|
+
else
|
216
|
+
collection
|
217
|
+
end
|
218
|
+
end
|
210
219
|
|
211
220
|
# Clear out all the cached ivars so the search can be called again.
|
212
221
|
def reset
|
@@ -21,23 +21,27 @@ describe 'search with highlighting results', :type => :search do
|
|
21
21
|
@search.hits.last.should have(2).highlights(:body)
|
22
22
|
end
|
23
23
|
|
24
|
+
it 'returns first highlight for a specified field' do
|
25
|
+
@search.hits.first.highlight(:title).format.should == 'one <em>two</em> three'
|
26
|
+
end
|
27
|
+
|
24
28
|
it 'returns an empty array if a given field does not have a highlight' do
|
25
29
|
@search.hits.first.highlights(:body).should == []
|
26
30
|
end
|
27
31
|
|
28
|
-
it '
|
32
|
+
it 'formats hits with <em> by default' do
|
29
33
|
highlight = @search.hits.first.highlights(:title).first.formatted
|
30
34
|
highlight.should == 'one <em>two</em> three'
|
31
35
|
end
|
32
36
|
|
33
|
-
it '
|
37
|
+
it 'formats hits with provided block' do
|
34
38
|
highlight = @search.hits.first.highlights(:title).first.format do |word|
|
35
39
|
"<i>#{word}</i>"
|
36
40
|
end
|
37
41
|
highlight.should == 'one <i>two</i> three'
|
38
42
|
end
|
39
43
|
|
40
|
-
it '
|
44
|
+
it 'handles multiple highlighted words' do
|
41
45
|
highlight = @search.hits.last.highlights(:body).last.format do |word|
|
42
46
|
"<b>#{word}</b>"
|
43
47
|
end
|
@@ -12,6 +12,24 @@ describe 'hits', :type => :search do
|
|
12
12
|
end.should == [['Post', post_1.id.to_s], ['Post', post_2.id.to_s]]
|
13
13
|
end
|
14
14
|
|
15
|
+
if ENV['USE_WILL_PAGINATE']
|
16
|
+
|
17
|
+
it 'returns search total as attribute of hits' do
|
18
|
+
stub_results(Post.new, 4)
|
19
|
+
session.search(Post) do
|
20
|
+
paginate(:page => 1)
|
21
|
+
end.hits.total_entries.should == 4
|
22
|
+
end
|
23
|
+
else
|
24
|
+
|
25
|
+
it 'returns vanilla array of hits if WillPaginate is not available' do
|
26
|
+
stub_results(Post.new)
|
27
|
+
session.search(Post) do
|
28
|
+
paginate(:page => 1)
|
29
|
+
end.hits.should_not respond_to(:total_entries)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
15
33
|
it 'should return instance from hit' do
|
16
34
|
posts = Array.new(2) { Post.new }
|
17
35
|
stub_results(*posts)
|
data/tasks/gemspec.rake
CHANGED
data/tasks/rdoc.rake
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sunspot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mat Brown
|
@@ -18,7 +18,7 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date:
|
21
|
+
date: 2010-01-10 00:00:00 -05:00
|
22
22
|
default_executable:
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
@@ -258,59 +258,59 @@ signing_key:
|
|
258
258
|
specification_version: 3
|
259
259
|
summary: Library for expressive, powerful interaction with the Solr search engine
|
260
260
|
test_files:
|
261
|
-
- spec/spec_helper.rb
|
262
|
-
- spec/helpers/indexer_helper.rb
|
263
|
-
- spec/helpers/search_helper.rb
|
264
261
|
- spec/helpers/query_helper.rb
|
265
|
-
- spec/
|
266
|
-
- spec/
|
267
|
-
- spec/
|
268
|
-
- spec/
|
269
|
-
- spec/
|
270
|
-
- spec/
|
271
|
-
- spec/
|
272
|
-
- spec/
|
273
|
-
- spec/
|
274
|
-
- spec/
|
275
|
-
- spec/
|
276
|
-
- spec/
|
277
|
-
- spec/
|
278
|
-
- spec/
|
279
|
-
- spec/
|
280
|
-
- spec/
|
281
|
-
- spec/mocks/post.rb
|
282
|
-
- spec/mocks/comment.rb
|
283
|
-
- spec/mocks/super_class.rb
|
284
|
-
- spec/mocks/connection.rb
|
285
|
-
- spec/api/spec_helper.rb
|
262
|
+
- spec/helpers/search_helper.rb
|
263
|
+
- spec/helpers/indexer_helper.rb
|
264
|
+
- spec/api/adapters_spec.rb
|
265
|
+
- spec/api/query/text_field_scoping_spec.rb
|
266
|
+
- spec/api/query/fulltext_spec.rb
|
267
|
+
- spec/api/query/adjust_params_spec.rb
|
268
|
+
- spec/api/query/dynamic_fields_spec.rb
|
269
|
+
- spec/api/query/highlighting_spec.rb
|
270
|
+
- spec/api/query/ordering_pagination_spec.rb
|
271
|
+
- spec/api/query/spec_helper.rb
|
272
|
+
- spec/api/query/local_spec.rb
|
273
|
+
- spec/api/query/types_spec.rb
|
274
|
+
- spec/api/query/scope_spec.rb
|
275
|
+
- spec/api/query/faceting_spec.rb
|
276
|
+
- spec/api/query/dsl_spec.rb
|
277
|
+
- spec/api/query/connectives_spec.rb
|
286
278
|
- spec/api/session_spec.rb
|
287
|
-
- spec/api/
|
288
|
-
- spec/api/indexer/fixed_fields_spec.rb
|
289
|
-
- spec/api/indexer/attributes_spec.rb
|
290
|
-
- spec/api/indexer/dynamic_fields_spec.rb
|
279
|
+
- spec/api/spec_helper.rb
|
291
280
|
- spec/api/indexer/fulltext_spec.rb
|
281
|
+
- spec/api/indexer/dynamic_fields_spec.rb
|
292
282
|
- spec/api/indexer/removal_spec.rb
|
283
|
+
- spec/api/indexer/spec_helper.rb
|
284
|
+
- spec/api/indexer/fixed_fields_spec.rb
|
293
285
|
- spec/api/indexer/batch_spec.rb
|
294
|
-
- spec/api/
|
286
|
+
- spec/api/indexer/attributes_spec.rb
|
287
|
+
- spec/api/indexer_spec.rb
|
295
288
|
- spec/api/search/hits_spec.rb
|
296
|
-
- spec/api/search/faceting_spec.rb
|
297
|
-
- spec/api/search/highlighting_spec.rb
|
298
289
|
- spec/api/search/dynamic_fields_spec.rb
|
299
290
|
- spec/api/search/search_spec.rb
|
300
291
|
- spec/api/search/results_spec.rb
|
301
|
-
- spec/api/
|
302
|
-
- spec/api/
|
303
|
-
- spec/api/
|
304
|
-
- spec/api/query/faceting_spec.rb
|
305
|
-
- spec/api/query/connectives_spec.rb
|
306
|
-
- spec/api/query/adjust_params_spec.rb
|
307
|
-
- spec/api/query/local_spec.rb
|
308
|
-
- spec/api/query/highlighting_spec.rb
|
309
|
-
- spec/api/query/ordering_pagination_spec.rb
|
310
|
-
- spec/api/query/dynamic_fields_spec.rb
|
311
|
-
- spec/api/query/types_spec.rb
|
312
|
-
- spec/api/query/scope_spec.rb
|
313
|
-
- spec/api/query/text_field_scoping_spec.rb
|
314
|
-
- spec/api/query/fulltext_spec.rb
|
292
|
+
- spec/api/search/highlighting_spec.rb
|
293
|
+
- spec/api/search/spec_helper.rb
|
294
|
+
- spec/api/search/faceting_spec.rb
|
315
295
|
- spec/api/sunspot_spec.rb
|
316
|
-
- spec/
|
296
|
+
- spec/mocks/connection.rb
|
297
|
+
- spec/mocks/comment.rb
|
298
|
+
- spec/mocks/photo.rb
|
299
|
+
- spec/mocks/post.rb
|
300
|
+
- spec/mocks/super_class.rb
|
301
|
+
- spec/mocks/blog.rb
|
302
|
+
- spec/mocks/adapters.rb
|
303
|
+
- spec/mocks/mock_adapter.rb
|
304
|
+
- spec/mocks/mock_record.rb
|
305
|
+
- spec/mocks/user.rb
|
306
|
+
- spec/integration/dynamic_fields_spec.rb
|
307
|
+
- spec/integration/stored_fields_spec.rb
|
308
|
+
- spec/integration/highlighting_spec.rb
|
309
|
+
- spec/integration/local_search_spec.rb
|
310
|
+
- spec/integration/spec_helper.rb
|
311
|
+
- spec/integration/indexing_spec.rb
|
312
|
+
- spec/integration/keyword_search_spec.rb
|
313
|
+
- spec/integration/test_pagination.rb
|
314
|
+
- spec/integration/faceting_spec.rb
|
315
|
+
- spec/integration/scoped_search_spec.rb
|
316
|
+
- spec/spec_helper.rb
|