searchkick 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 32cdf7dc806463087e8de7a1178b759b18621a3e
4
- data.tar.gz: 354388509186cbd11616c958832182a892aacff9
3
+ metadata.gz: d67265d1ad299d9e79b7f1020197f3b12f551535
4
+ data.tar.gz: b72d9fb064fad2f904db6d2cf69e9be96fb8c44e
5
5
  SHA512:
6
- metadata.gz: 0154a4d77e5c9308a26c8524db04dbbe75b471ab5875835cb1d0c0594e0543e1e7bd9bb8f31384eb166bb513af6faede705d11964942674ec9452df7b113aac3
7
- data.tar.gz: f5477b6069d310f813a2e0f84a6452920583458ba4ded63cc973976181dcf033271d90e3d30e5d7c1edbc3288bc4516adcbaee29dcbb12c96ebb7639e9c263c5
6
+ metadata.gz: 7ec7b5537539de163009b0857bd84a78829a0520b55b1f77544d0a65dee789dfce467b7afc63aa4aa54327d87be1dc3954178d3d209a35bb92e47c5179ad53a3
7
+ data.tar.gz: c9710769dd1045f5e8cfb1cd4cc86242df365289d28409bf8c47fe19e3b829b6d5b7ab6bed8ba890e56189ececacad520280c0940651bb2d8cdb2a0f78ac1356
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.3.4
2
+
3
+ - Added highlighting
4
+ - Added :distance option to misspellings
5
+ - Fixed issue w/ BigDecimal serialization
6
+
1
7
  ## 0.3.3
2
8
 
3
9
  - Better error messages
data/README.md CHANGED
@@ -29,7 +29,7 @@ Plus:
29
29
 
30
30
  ## Get Started
31
31
 
32
- [Install Elasticsearch](http://www.elasticsearch.org/guide/reference/setup/installation/). For Homebrew, use:
32
+ [Install Elasticsearch](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html). For Homebrew, use:
33
33
 
34
34
  ```sh
35
35
  brew install elasticsearch
@@ -152,7 +152,13 @@ Call `Product.reindex` after changing synonyms.
152
152
  By default, Searchkick handles misspelled queries by returning results with an [edit distance](http://en.wikipedia.org/wiki/Levenshtein_distance) of one. To turn off this feature, use:
153
153
 
154
154
  ```ruby
155
- Product.search "zuchini", misspellings: false
155
+ Product.search "zuchini", misspellings: false # no zucchini
156
+ ```
157
+
158
+ You can also change the edit distance with:
159
+
160
+ ```ruby
161
+ Product.search "zucini", misspellings: {distance: 2} # zucchini
156
162
  ```
157
163
 
158
164
  ### Indexing
@@ -342,6 +348,30 @@ Advanced
342
348
  Product.search "2% Milk", facets: {store_id: {where: {in_stock: true}, limit: 10}}
343
349
  ```
344
350
 
351
+ ### Highlight
352
+
353
+ Highlight the search query in the results.
354
+
355
+ ```ruby
356
+ bands = Band.search "cinema", fields: [:name], highlight: true
357
+ ```
358
+
359
+ **Note:** The `fields` option is required.
360
+
361
+ View the highlighted fields with:
362
+
363
+ ```ruby
364
+ bands.with_details.each do |band, details|
365
+ puts details[:highlight][:name] # "Two Door <em>Cinema</em> Club"
366
+ end
367
+ ```
368
+
369
+ To change the tag, use:
370
+
371
+ ```ruby
372
+ Band.search "cinema", fields: [:name], highlight: {tag: "<strong>"}
373
+ ```
374
+
345
375
  ### Similar Items
346
376
 
347
377
  Find similar items.
@@ -528,7 +558,7 @@ rake searchkick:reindex:all
528
558
 
529
559
  ```ruby
530
560
  class Product < ActiveRecord::Base
531
- searchkick
561
+ searchkick
532
562
  end
533
563
  ```
534
564
 
@@ -560,7 +590,6 @@ Thanks to Karel Minarik for [Tire](https://github.com/karmi/tire), Jaroslav Kali
560
590
 
561
591
  ## TODO
562
592
 
563
- - Analytics for searches and conversions
564
593
  - Generate autocomplete predictions from past search queries
565
594
  - Automatic failover
566
595
  - Make Searchkick work with any language
@@ -61,6 +61,29 @@ module Searchkick
61
61
  source[field] = source[field].map(&:to_f).reverse if source[field]
62
62
  end
63
63
 
64
+ # change all BigDecimal values to floats due to
65
+ # https://github.com/rails/rails/issues/6033
66
+ # possible loss of precision :/
67
+ cast_big_decimal =
68
+ proc do |obj|
69
+ case obj
70
+ when BigDecimal
71
+ obj.to_f
72
+ when Hash
73
+ obj.each do |k, v|
74
+ obj[k] = cast_big_decimal.call(v)
75
+ end
76
+ when Enumerable
77
+ obj.map! do |v|
78
+ cast_big_decimal.call(v)
79
+ end
80
+ else
81
+ obj
82
+ end
83
+ end
84
+
85
+ cast_big_decimal.call(source)
86
+
64
87
  source.to_json
65
88
  end
66
89
 
@@ -203,6 +203,8 @@ module Searchkick
203
203
  fields: {
204
204
  field => {type: "string", index: "not_analyzed"},
205
205
  "analyzed" => {type: "string", index: "analyzed"}
206
+ # term_vector: "with_positions_offsets" for fast / correct highlighting
207
+ # http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-highlighting.html#_fast_vector_highlighter
206
208
  }
207
209
  }
208
210
  if autocomplete.include?(field)
@@ -9,6 +9,16 @@ module Searchkick
9
9
  end
10
10
  end
11
11
 
12
+ def with_details
13
+ each_with_hit.map do |model, hit|
14
+ details = {}
15
+ if hit["highlight"]
16
+ details[:highlight] = Hash[ hit["highlight"].map{|k, v| [k.sub(/\.analyzed\z/, "").to_sym, v.first] } ]
17
+ end
18
+ [model, details]
19
+ end
20
+ end
21
+
12
22
  # fixes deprecation warning
13
23
  def __find_records_by_ids(klass, ids)
14
24
  @options[:load] === true ? klass.find(ids) : klass.includes(@options[:load][:include]).find(ids)
@@ -70,9 +70,10 @@ module Searchkick
70
70
  {multi_match: shared_options.merge(boost: 10, analyzer: "searchkick_search2")}
71
71
  ]
72
72
  if options[:misspellings] != false
73
+ distance = (options[:misspellings].is_a?(Hash) && options[:misspellings][:distance]) || 1
73
74
  queries.concat [
74
- {multi_match: shared_options.merge(fuzziness: 1, max_expansions: 3, analyzer: "searchkick_search")},
75
- {multi_match: shared_options.merge(fuzziness: 1, max_expansions: 3, analyzer: "searchkick_search2")}
75
+ {multi_match: shared_options.merge(fuzziness: distance, max_expansions: 3, analyzer: "searchkick_search")},
76
+ {multi_match: shared_options.merge(fuzziness: distance, max_expansions: 3, analyzer: "searchkick_search2")}
76
77
  ]
77
78
  end
78
79
  payload = {
@@ -288,6 +289,17 @@ module Searchkick
288
289
  end
289
290
  end
290
291
 
292
+ # highlight
293
+ if options[:highlight]
294
+ payload[:highlight] = {
295
+ fields: Hash[ fields.map{|f| [f, {}] } ]
296
+ }
297
+ if options[:highlight].is_a?(Hash) and tag = options[:highlight][:tag]
298
+ payload[:highlight][:pre_tags] = [tag]
299
+ payload[:highlight][:post_tags] = [tag.to_s.gsub(/\A</, "</")]
300
+ end
301
+ end
302
+
291
303
  # An empty array will cause only the _id and _type for each hit to be returned
292
304
  # http://www.elasticsearch.org/guide/reference/api/search/fields/
293
305
  payload[:fields] = [] if load
@@ -23,8 +23,10 @@ namespace :searchkick do
23
23
  task :all => :environment do
24
24
  Rails.application.eager_load!
25
25
  (Searchkick::Reindex.instance_variable_get(:@descendents) || []).each do |model|
26
+ puts "Reindexing #{model.name}..."
26
27
  model.reindex
27
28
  end
29
+ puts "Reindex complete"
28
30
  end
29
31
  end
30
32
 
@@ -1,3 +1,3 @@
1
1
  module Searchkick
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.4"
3
3
  end
@@ -0,0 +1,22 @@
1
+ require_relative "test_helper"
2
+
3
+ class TestHighlight < Minitest::Unit::TestCase
4
+
5
+ def test_basic
6
+ store_names ["Two Door Cinema Club"]
7
+ assert_equal "Two Door <em>Cinema</em> Club", Product.search("cinema", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
8
+ end
9
+
10
+ def test_tag
11
+ store_names ["Two Door Cinema Club"]
12
+ assert_equal "Two Door <strong>Cinema</strong> Club", Product.search("cinema", fields: [:name], highlight: {tag: "<strong>"}).with_details.first[1][:highlight][:name]
13
+ end
14
+
15
+ def test_multiple_fields
16
+ store [{name: "Two Door Cinema Club", color: "Cinema Orange"}]
17
+ highlight = Product.search("cinema", fields: [:name, :color], highlight: true).with_details.first[1][:highlight]
18
+ assert_equal "Two Door <em>Cinema</em> Club", highlight[:name]
19
+ assert_equal "<em>Cinema</em> Orange", highlight[:color]
20
+ end
21
+
22
+ end
data/test/sql_test.rb CHANGED
@@ -129,6 +129,11 @@ class TestSql < Minitest::Unit::TestCase
129
129
  assert_search "abc", ["abc"], misspellings: false
130
130
  end
131
131
 
132
+ def test_misspellings_distance
133
+ store_names ["abbb", "aabb"]
134
+ assert_search "aaaa", ["aabb"], misspellings: {distance: 2}
135
+ end
136
+
132
137
  def test_fields
133
138
  store [
134
139
  {name: "red", color: "light blue"},
@@ -150,6 +155,13 @@ class TestSql < Minitest::Unit::TestCase
150
155
  assert_first "blue", "Blue B", fields: [:name, :color]
151
156
  end
152
157
 
158
+ def test_big_decimal
159
+ store [
160
+ {name: "Product", latitude: 100.0}
161
+ ]
162
+ assert_search "product", ["Product"], where: {latitude: {gt: 99}}
163
+ end
164
+
153
165
  # load
154
166
 
155
167
  def test_load_default
data/test/suggest_test.rb CHANGED
@@ -4,17 +4,17 @@ class TestSuggest < Minitest::Unit::TestCase
4
4
 
5
5
  def test_basic
6
6
  store_names ["Great White Shark", "Hammerhead Shark", "Tiger Shark"]
7
- assert_suggest "How Big is a Tigre Shar", "how big is a tiger shark"
7
+ assert_suggest "How Big is a Tigre Shar", "how big is a tiger shark", fields: [:name]
8
8
  end
9
9
 
10
10
  def test_perfect
11
11
  store_names ["Tiger Shark", "Great White Shark"]
12
- assert_suggest "Tiger Shark", nil # no correction
12
+ assert_suggest "Tiger Shark", nil, fields: [:name] # no correction
13
13
  end
14
14
 
15
15
  def test_phrase
16
16
  store_names ["Big Tiger Shark", "Tiger Sharp Teeth", "Tiger Sharp Mind"]
17
- assert_suggest "How to catch a big tiger shar", "how to catch a big tiger shark"
17
+ assert_suggest "How to catch a big tiger shar", "how to catch a big tiger shark", fields: [:name]
18
18
  end
19
19
 
20
20
  def test_without_option
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.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-04 00:00:00.000000000 Z
11
+ date: 2013-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tire
@@ -135,6 +135,7 @@ files:
135
135
  - test/autocomplete_test.rb
136
136
  - test/boost_test.rb
137
137
  - test/facets_test.rb
138
+ - test/highlight_test.rb
138
139
  - test/index_test.rb
139
140
  - test/inheritance_test.rb
140
141
  - test/match_test.rb
@@ -171,6 +172,7 @@ test_files:
171
172
  - test/autocomplete_test.rb
172
173
  - test/boost_test.rb
173
174
  - test/facets_test.rb
175
+ - test/highlight_test.rb
174
176
  - test/index_test.rb
175
177
  - test/inheritance_test.rb
176
178
  - test/match_test.rb