searchkick 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7cffd1af1407a4da1aedcc1a7af63202939586c5
4
- data.tar.gz: 3fa1d499bb7f1fd4ff7a71a92fc2237931cc04fd
3
+ metadata.gz: 174eaff2241d0285d027261332c228bae2cf9215
4
+ data.tar.gz: db755391a04705242e8d21a54c8374518a1b7344
5
5
  SHA512:
6
- metadata.gz: 0c98bdf5690ec1bb4b837033f9e08c80cd6aacaa2d811c651108fedcee940df68168ec015c4207b210c3003315a9910517d7fd8210e7b3b2daec1d50c280cf15
7
- data.tar.gz: a101b6f2ccd2d7c65d8290b9da7bdc5da8da1efceef7cd51371c743e7bef5cb988b9a6193ef50bf2d5f206c019712090b30f573046bed2058bc3eeef611ab9f1
6
+ metadata.gz: 587dc4255bb875770e109c1c120fac8775a83f818d009d42bdea27d664af88c93ac3b4bc4e37d7bce033e60f54213fbb41eb5f873bfaffcdb9b6ab0d4605a1ec
7
+ data.tar.gz: a2da459414ad0a95efbe58c313593367f1e1d7dd3d61d6539c404c813ac204e0b37cae0144ea8366ee0af73fff9a9aeff9d24057b00d001fe00eee5e92caff4a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.7.3
2
+
3
+ - Fixed multi-index searches
4
+ - Fixed suggestions for partial matches
5
+ - Added `offset` and `length` for improved pagination
6
+
1
7
  ## 0.7.2
2
8
 
3
9
  - Added smart facets
data/README.md CHANGED
@@ -331,6 +331,8 @@ Autocomplete predicts what a user will type, making the search experience faster
331
331
 
332
332
  ![Autocomplete](http://ankane.github.io/searchkick/autocomplete.png)
333
333
 
334
+ **Note:** If you only have a few thousand records, don’t use Searchkick for autocomplete. It’s *much* faster to load all records into JavaScript and autocomplete there (eliminates network requests).
335
+
334
336
  First, specify which fields use this feature. This is necessary since autocomplete can increase the index size significantly, but don’t worry - this gives you blazing faster queries.
335
337
 
336
338
  ```ruby
@@ -345,7 +347,7 @@ Reindex and search with:
345
347
  City.search "san fr", fields: [{name: :text_start}]
346
348
  ```
347
349
 
348
- Typically, you want to use a Javascript library like [typeahead.js](http://twitter.github.io/typeahead.js/) or [jQuery UI](http://jqueryui.com/autocomplete/).
350
+ Typically, you want to use a JavaScript library like [typeahead.js](http://twitter.github.io/typeahead.js/) or [jQuery UI](http://jqueryui.com/autocomplete/).
349
351
 
350
352
  #### Here’s how to make it work with Rails
351
353
 
@@ -362,7 +364,7 @@ class CitiesController < ApplicationController
362
364
  end
363
365
  ```
364
366
 
365
- Then add the search box and Javascript code to a view.
367
+ Then add the search box and JavaScript code to a view.
366
368
 
367
369
  ```html
368
370
  <input type="text" id="query" name="query" />
@@ -254,8 +254,12 @@ module Searchkick
254
254
  # suggestions
255
255
  if options[:suggest]
256
256
  suggest_fields = (searchkick_options[:suggest] || []).map(&:to_s)
257
+
257
258
  # intersection
258
- suggest_fields = suggest_fields & options[:fields].map(&:to_s) if options[:fields]
259
+ if options[:fields]
260
+ suggest_fields = suggest_fields & options[:fields].map{|v| (v.is_a?(Hash) ? v.keys.first : v).to_s }
261
+ end
262
+
259
263
  if suggest_fields.any?
260
264
  payload[:suggest] = {text: term}
261
265
  suggest_fields.each do |field|
@@ -5,7 +5,7 @@ module Searchkick
5
5
 
6
6
  attr_reader :klass, :response, :options
7
7
 
8
- def_delegators :results, :each, :empty?, :size, :slice, :[], :to_ary
8
+ def_delegators :results, :each, :any?, :empty?, :size, :length, :slice, :[], :to_ary
9
9
 
10
10
  def initialize(klass, response, options = {})
11
11
  @klass = klass
@@ -16,14 +16,21 @@ module Searchkick
16
16
  def results
17
17
  @results ||= begin
18
18
  if options[:load]
19
- hit_ids = hits.map{|hit| hit["_id"] }
20
- records = klass
21
- if options[:includes]
22
- records = records.includes(options[:includes])
19
+ # results can have different types
20
+ results = {}
21
+
22
+ hits.group_by{|hit, i| hit["_type"] }.each do |type, grouped_hits|
23
+ records = type.camelize.constantize
24
+ if options[:includes]
25
+ records = records.includes(options[:includes])
26
+ end
27
+ results[type] = records.find(grouped_hits.map{|hit| hit["_id"] })
28
+ end
29
+
30
+ # sort
31
+ hits.map do |hit|
32
+ results[hit["_type"]].find{|r| r.id.to_s == hit["_id"].to_s }
23
33
  end
24
- records = records.find(hit_ids)
25
- hit_ids = hit_ids.map(&:to_s)
26
- records.sort_by{|r| hit_ids.index(r.id.to_s) }
27
34
  else
28
35
  hits.map do |hit|
29
36
  result = hit.except("_source").merge(hit["_source"])
@@ -85,6 +92,7 @@ module Searchkick
85
92
  def offset_value
86
93
  current_page * per_page
87
94
  end
95
+ alias_method :offset, :offset_value
88
96
 
89
97
  def previous_page
90
98
  current_page > 1 ? (current_page - 1) : nil
@@ -1,3 +1,3 @@
1
1
  module Searchkick
2
- VERSION = "0.7.2"
2
+ VERSION = "0.7.3"
3
3
  end
@@ -62,4 +62,12 @@ class TestInheritance < Minitest::Unit::TestCase
62
62
  assert_equal ["tiger"], Animal.search("tige", fields: [:name], suggest: true).suggestions.sort
63
63
  end
64
64
 
65
+ # TODO move somewhere better
66
+
67
+ def test_multiple_indices
68
+ store_names ["Product A"]
69
+ store_names ["Product B"], Animal
70
+ assert_search "product", ["Product A", "Product B"], index_name: [Product.searchkick_index.name, Animal.searchkick_index.name], conversions: false
71
+ end
72
+
65
73
  end
data/test/sql_test.rb CHANGED
@@ -24,13 +24,18 @@ class TestSql < Minitest::Unit::TestCase
24
24
  assert_equal ["Product C", "Product D"], products.map(&:name)
25
25
  assert_equal 2, products.current_page
26
26
  assert_equal 2, products.per_page
27
+ assert_equal 2, products.size
28
+ assert_equal 2, products.length
27
29
  assert_equal 3, products.total_pages
28
30
  assert_equal 5, products.total_count
29
31
  assert_equal 5, products.total_entries
30
32
  assert_equal 2, products.limit_value
31
33
  assert_equal 4, products.offset_value
34
+ assert_equal 4, products.offset
32
35
  assert !products.first_page?
33
36
  assert !products.last_page?
37
+ assert !products.empty?
38
+ assert products.any?
34
39
  end
35
40
 
36
41
  def test_pagination_nil_page
data/test/suggest_test.rb CHANGED
@@ -56,6 +56,11 @@ class TestSuggest < Minitest::Unit::TestCase
56
56
  assert_suggest "shar", "shark", fields: [:name, :unknown]
57
57
  end
58
58
 
59
+ def test_fields_word_start
60
+ store_names ["Great White Shark", "Hammerhead Shark", "Tiger Shark"]
61
+ assert_suggest "How Big is a Tigre Shar", "how big is a tiger shark", fields: [{name: :word_start}]
62
+ end
63
+
59
64
  protected
60
65
 
61
66
  def assert_suggest(term, expected, options = {})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: searchkick
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-25 00:00:00.000000000 Z
11
+ date: 2014-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel