searchkick 2.5.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +7 -0
  3. data/.travis.yml +2 -11
  4. data/CHANGELOG.md +22 -0
  5. data/CONTRIBUTING.md +1 -1
  6. data/Gemfile +3 -3
  7. data/LICENSE.txt +1 -1
  8. data/README.md +68 -141
  9. data/Rakefile +0 -4
  10. data/benchmark/Gemfile +3 -2
  11. data/benchmark/{benchmark.rb → index.rb} +33 -31
  12. data/benchmark/search.rb +48 -0
  13. data/docs/Searchkick-3-Upgrade.md +57 -0
  14. data/lib/searchkick.rb +50 -27
  15. data/lib/searchkick/bulk_indexer.rb +168 -0
  16. data/lib/searchkick/bulk_reindex_job.rb +1 -1
  17. data/lib/searchkick/index.rb +122 -348
  18. data/lib/searchkick/index_options.rb +29 -26
  19. data/lib/searchkick/logging.rb +8 -7
  20. data/lib/searchkick/model.rb +37 -90
  21. data/lib/searchkick/multi_search.rb +6 -7
  22. data/lib/searchkick/query.rb +169 -166
  23. data/lib/searchkick/record_data.rb +133 -0
  24. data/lib/searchkick/record_indexer.rb +55 -0
  25. data/lib/searchkick/reindex_queue.rb +1 -1
  26. data/lib/searchkick/reindex_v2_job.rb +10 -13
  27. data/lib/searchkick/results.rb +14 -25
  28. data/lib/searchkick/tasks.rb +0 -4
  29. data/lib/searchkick/version.rb +1 -1
  30. data/searchkick.gemspec +3 -3
  31. data/test/boost_test.rb +3 -9
  32. data/test/geo_shape_test.rb +0 -4
  33. data/test/highlight_test.rb +28 -12
  34. data/test/index_test.rb +9 -10
  35. data/test/language_test.rb +16 -0
  36. data/test/marshal_test.rb +6 -1
  37. data/test/match_test.rb +9 -4
  38. data/test/model_test.rb +3 -5
  39. data/test/multi_search_test.rb +0 -7
  40. data/test/order_test.rb +1 -7
  41. data/test/pagination_test.rb +1 -1
  42. data/test/reindex_v2_job_test.rb +6 -11
  43. data/test/routing_test.rb +1 -1
  44. data/test/similar_test.rb +2 -2
  45. data/test/sql_test.rb +0 -31
  46. data/test/test_helper.rb +37 -23
  47. metadata +19 -26
  48. data/test/gemfiles/activerecord31.gemfile +0 -7
  49. data/test/gemfiles/activerecord32.gemfile +0 -7
  50. data/test/gemfiles/activerecord40.gemfile +0 -8
  51. data/test/gemfiles/activerecord41.gemfile +0 -8
  52. data/test/gemfiles/mongoid2.gemfile +0 -7
  53. data/test/gemfiles/mongoid3.gemfile +0 -6
  54. data/test/gemfiles/mongoid4.gemfile +0 -7
  55. data/test/records_test.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 48b011f59eaeb3f3b2213e20bf2206d4963f7bb0
4
- data.tar.gz: d3ffbd07eda7ca733915c251ce8b1e1c9c146e44
3
+ metadata.gz: 0114d21ec3a6707c49408e641fa27a5591cc9eca
4
+ data.tar.gz: d723af7de81aa5ff40818fcd229029724a0fcda7
5
5
  SHA512:
6
- metadata.gz: 910eaa5810045780efabe7874e0c4e6bb669ad30c3f1bead3c37ab1f817e21a5e73c55acfcf7ffeacc63be95e163ddb5470b4912967379062afab45413d9d8ea
7
- data.tar.gz: eae561c188d98071116695b8997f95ac31f1d0229fc56f968193aaac423020ee1219344568c61e2e1d7ddeee94f583189300845b5f5927a7122ab2cf5305f127
6
+ metadata.gz: 04b026c1acdd413476a2099f7b0b335c207f286e4aadd9d323f0f5d8f5bc18cd15da2219040830a12f258dba497c9412510815fd2af70682e3579239caeaabba
7
+ data.tar.gz: e41240ef1831b869311c588a3a6d87c054607fedd2d3da3d56db4d220ae7c1038a317cb703f220b36f06c2ada8b99f2a34cd8e3b7f7c046d6ad2fb2115004a3c
@@ -0,0 +1,7 @@
1
+ Hi,
2
+
3
+ Before creating an issue, please check out the Contributing Guide:
4
+
5
+ https://github.com/ankane/searchkick/blob/master/CONTRIBUTING.md
6
+
7
+ Thanks!
data/.travis.yml CHANGED
@@ -20,22 +20,13 @@ gemfile:
20
20
  - test/gemfiles/mongoid5.gemfile
21
21
  - test/gemfiles/mongoid6.gemfile
22
22
  env:
23
- - ELASTICSEARCH_VERSION=6.2.1
23
+ - ELASTICSEARCH_VERSION=6.2.2
24
24
  jdk: oraclejdk8
25
25
  matrix:
26
26
  include:
27
- - gemfile: Gemfile
28
- env: ELASTICSEARCH_VERSION=2.0.0
29
- jdk: oraclejdk7
30
- - gemfile: Gemfile
31
- env: ELASTICSEARCH_VERSION=2.4.6
32
- jdk: oraclejdk7
33
27
  - gemfile: Gemfile
34
28
  env: ELASTICSEARCH_VERSION=5.0.1
35
- jdk: oraclejdk8
36
29
  - gemfile: Gemfile
37
- env: ELASTICSEARCH_VERSION=5.6.4
38
- jdk: oraclejdk8
30
+ env: ELASTICSEARCH_VERSION=5.6.7
39
31
  - gemfile: Gemfile
40
32
  env: ELASTICSEARCH_VERSION=6.0.0
41
- jdk: oraclejdk8
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## 3.0.0
2
+
3
+ - Added support for Chinese
4
+ - Results can be marshaled by default (unless using `highlight` option)
5
+
6
+ Breaking changes
7
+
8
+ - Removed support for Elasticsearch 2
9
+ - Removed support for ActiveRecord < 4.2 and Mongoid < 5
10
+ - Types are no longer used
11
+ - The `_all` field is disabled by default in Elasticsearch 5
12
+ - Conversions are not stemmed by default
13
+ - An `ArgumentError` is raised instead of a warning when options are incompatible with the `body` option
14
+ - Removed `log` option from `boost_by`
15
+ - Removed `Model.enable_search_callbacks`, `Model.disable_search_callbacks`, and `Model.search_callbacks?`
16
+ - Removed `reindex_async` method, as `reindex` now defaults to callbacks mode specified on the model
17
+ - Removed `async` option from `record.reindex`
18
+ - Removed `search_hit` method - use `with_hit` instead
19
+ - Removed `each_with_hit` - use `with_hit.each` instead
20
+ - Removed `with_details` - use `with_highlights` instead
21
+ - Bumped default `limit` to 10,000
22
+
1
23
  ## 2.5.0
2
24
 
3
25
  - Try requests 3 times before raising error
data/CONTRIBUTING.md CHANGED
@@ -29,7 +29,7 @@ Product.search("something", debug: true)
29
29
 
30
30
  If the above steps don’t help, create an issue.
31
31
 
32
- - For incorrect search results, recreate the problem by forking [this gist](https://gist.github.com/ankane/f80b0923d9ae2c077f41997f7b704e5c). Include a link to your gist and the output in the issue.
32
+ - Recreate the problem by forking [this gist](https://gist.github.com/ankane/f80b0923d9ae2c077f41997f7b704e5c). Include a link to your gist and the output in the issue.
33
33
  - For exceptions, include the complete backtrace.
34
34
 
35
35
  ## Pull Requests
data/Gemfile CHANGED
@@ -4,13 +4,13 @@ source "https://rubygems.org"
4
4
  gemspec
5
5
 
6
6
  gem "sqlite3"
7
- gem "activerecord", "~> 5.1.0"
7
+ gem "activerecord", "~> 5.2.0.rc1"
8
8
  gem "gemoji-parser"
9
9
  gem "typhoeus"
10
- gem "activejob"
10
+ gem "activejob", "~> 5.2.0.rc1"
11
11
  gem "redis"
12
12
  gem "connection_pool"
13
13
 
14
14
  # kaminari
15
- gem "actionpack"
15
+ gem "actionpack", "~> 5.2.0.rc1"
16
16
  gem "kaminari"
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013-2016 Andrew Kane
1
+ Copyright (c) 2013-2018 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  :rocket: Intelligent search made easy
4
4
 
5
- Searchkick learns what **your users** are looking for. As more people search, it gets smarter and the results get better. It’s friendly for developers - and magical for your users.
5
+ **Searchkick learns what your users are looking for.** As more people search, it gets smarter and the results get better. It’s friendly for developers - and magical for your users.
6
6
 
7
7
  Searchkick handles:
8
8
 
@@ -27,6 +27,12 @@ Plus:
27
27
 
28
28
  [![Build Status](https://travis-ci.org/ankane/searchkick.svg?branch=master)](https://travis-ci.org/ankane/searchkick)
29
29
 
30
+ ---
31
+
32
+ Does your startup use Searchkick? Want a free hour of advising? Fill out [this application](https://goo.gl/forms/Or1HQTRb2rgQCNtd2). I’ll reach out to a few companies.
33
+
34
+ ---
35
+
30
36
  ## Contents
31
37
 
32
38
  - [Getting Started](#getting-started)
@@ -39,6 +45,10 @@ Plus:
39
45
  - [Elasticsearch DSL](#advanced)
40
46
  - [Reference](#reference)
41
47
 
48
+ **Searchkick 3.0 was recently released!** See [how to upgrade](docs/Searchkick-3-Upgrade.md)
49
+
50
+ Thinking of upgrading from Elasticsearch 5 to 6? [Read this first](#elasticsearch-5-to-6-upgrade)
51
+
42
52
  ## Getting Started
43
53
 
44
54
  [Install Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html). For Homebrew, use:
@@ -54,7 +64,7 @@ Add this line to your application’s Gemfile:
54
64
  gem 'searchkick'
55
65
  ```
56
66
 
57
- The latest version works with Elasticsearch 2, 5, and 6. For Elasticsearch 1, use version 1.5.1 and [this readme](https://github.com/ankane/searchkick/blob/v1.5.1/README.md).
67
+ The latest version works with Elasticsearch 5 and 6. For Elasticsearch 2, use version 2.5.0 and [this readme](https://github.com/ankane/searchkick/blob/v2.5.0/README.md).
58
68
 
59
69
  Add searchkick to models you want to search.
60
70
 
@@ -73,7 +83,7 @@ Product.reindex
73
83
  And to query, use:
74
84
 
75
85
  ```ruby
76
- products = Product.search("apples", fields: [:name])
86
+ products = Product.search("apples")
77
87
  products.each do |product|
78
88
  puts product.name
79
89
  end
@@ -289,6 +299,14 @@ end
289
299
 
290
300
  [See the list of stemmers](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stemmer-tokenfilter.html)
291
301
 
302
+ For Chinese, install the [elasticsearch-analysis-ik plugin](https://github.com/medcl/elasticsearch-analysis-ik) and use:
303
+
304
+ ```ruby
305
+ class Product < ApplicationRecord
306
+ searchkick language: "chinese"
307
+ end
308
+ ```
309
+
292
310
  ### Synonyms
293
311
 
294
312
  ```ruby
@@ -492,7 +510,7 @@ There are four strategies for keeping the index synced with your database.
492
510
  end
493
511
  ```
494
512
 
495
- And [install Active Job](https://github.com/ankane/activejob_backport) for Rails 4.1 and below. Jobs are added to a queue named `searchkick`.
513
+ Jobs are added to a queue named `searchkick`.
496
514
 
497
515
  3. Queuing
498
516
 
@@ -535,7 +553,7 @@ class Image < ApplicationRecord
535
553
  after_commit :reindex_product
536
554
 
537
555
  def reindex_product
538
- product.reindex # or reindex_async
556
+ product.reindex
539
557
  end
540
558
  end
541
559
  ```
@@ -563,7 +581,7 @@ Searchkick can use conversion data to learn what users are looking for. If a use
563
581
 
564
582
  The first step is to define your conversion metric and start tracking conversions. The database works well for low volume, but feel free to use Redis or another datastore.
565
583
 
566
- You do **not** need to clean up the search queries. Searchkick automatically treats `apple` and `APPLES` the same.
584
+ Searchkick automatically treats `apple` and `APPLE` the same.
567
585
 
568
586
  Next, add conversions to the index.
569
587
 
@@ -571,7 +589,7 @@ Next, add conversions to the index.
571
589
  class Product < ApplicationRecord
572
590
  has_many :searches, class_name: "Searchjoy::Search", as: :convertable
573
591
 
574
- searchkick conversions: ["conversions"] # name of field
592
+ searchkick conversions: [:conversions] # name of field
575
593
 
576
594
  def search_data
577
595
  {
@@ -767,63 +785,6 @@ For other aggregation types, including sub-aggregations, use `body_options`:
767
785
  Product.search "orange", body_options: {aggs: {price: {histogram: {field: :price, interval: 10}}}
768
786
  ```
769
787
 
770
- #### Moving From Facets
771
-
772
- 1. Replace `facets` with `aggs` in searches. **Note:** Stats facets are not supported at this time.
773
-
774
- ```ruby
775
- products = Product.search "chuck taylor", facets: [:brand]
776
- # to
777
- products = Product.search "chuck taylor", aggs: [:brand]
778
- ```
779
-
780
- 2. Replace the `facets` method with `aggs` for results.
781
-
782
- ```ruby
783
- products.facets
784
- # to
785
- products.aggs
786
- ```
787
-
788
- The keys in results differ slightly. Instead of:
789
-
790
- ```json
791
- {
792
- "_type":"terms",
793
- "missing":0,
794
- "total":45,
795
- "other":34,
796
- "terms":[
797
- {"term":14.0,"count":11}
798
- ]
799
- }
800
- ```
801
-
802
- You get:
803
-
804
- ```json
805
- {
806
- "doc_count":45,
807
- "doc_count_error_upper_bound":0,
808
- "sum_other_doc_count":34,
809
- "buckets":[
810
- {"key":14.0,"doc_count":11}
811
- ]
812
- }
813
- ```
814
-
815
- Update your application to handle this.
816
-
817
- 3. By default, `where` conditions apply to aggregations. This is equivalent to `smart_facets: true`. If you have `smart_facets: true`, you can remove it. If this is not desired, set `smart_aggs: false`.
818
-
819
- 4. If you have any range facets with dates, change the key from `ranges` to `date_ranges`.
820
-
821
- ```ruby
822
- facets: {date_field: {ranges: date_ranges}}
823
- # to
824
- aggs: {date_field: {date_ranges: date_ranges}}
825
- ```
826
-
827
788
  ### Highlight
828
789
 
829
790
  Specify which fields to index with highlighting.
@@ -837,23 +798,21 @@ end
837
798
  Highlight the search query in the results.
838
799
 
839
800
  ```ruby
840
- bands = Band.search "cinema", fields: [:name], highlight: true
801
+ bands = Band.search "cinema", highlight: true
841
802
  ```
842
803
 
843
- **Note:** The `fields` option is required, unless highlight options are given - see below.
844
-
845
804
  View the highlighted fields with:
846
805
 
847
806
  ```ruby
848
- bands.each do |band|
849
- band.search_highlights[:name] # "Two Door <em>Cinema</em> Club"
807
+ bands.with_highlights.each do |band, highlights|
808
+ highlights[:name] # "Two Door <em>Cinema</em> Club"
850
809
  end
851
810
  ```
852
811
 
853
812
  To change the tag, use:
854
813
 
855
814
  ```ruby
856
- Band.search "cinema", fields: [:name], highlight: {tag: "<strong>"}
815
+ Band.search "cinema", highlight: {tag: "<strong>"}
857
816
  ```
858
817
 
859
818
  To highlight and search different fields, use:
@@ -862,7 +821,16 @@ To highlight and search different fields, use:
862
821
  Band.search "cinema", fields: [:name], highlight: {fields: [:description]}
863
822
  ```
864
823
 
865
- Additional options, including fragment size, can be specified for each field:
824
+ By default, the entire field is highlighted. To get small snippets instead, use:
825
+
826
+ ```ruby
827
+ bands = Band.search "cinema", highlight: {fragment_size: 20}
828
+ bands.with_highlights(multiple: true).each do |band, highlights|
829
+ highlights[:name].join(" and ")
830
+ end
831
+ ```
832
+
833
+ Additional options can be specified for each field:
866
834
 
867
835
  ```ruby
868
836
  Band.search "cinema", fields: [:name], highlight: {fields: {name: {fragment_size: 200}}}
@@ -966,7 +934,7 @@ Not touching the query shape
966
934
  Restaurant.search "burger", where: {bounds: {geo_shape: {type: "envelope", relation: "disjoint", coordinates: [{lat: 38, lon: -123}, {lat: 37, lon: -122}]}}}
967
935
  ```
968
936
 
969
- Containing the query shape (Elasticsearch 2.2+)
937
+ Containing the query shape
970
938
 
971
939
  ```ruby
972
940
  Restaurant.search "fries", where: {bounds: {geo_shape: {type: "envelope", relation: "contains", coordinates: [{lat: 38, lon: -123}, {lat: 37, lon: -122}]}}}
@@ -1093,12 +1061,6 @@ heroku run rake searchkick:reindex CLASS=Product
1093
1061
 
1094
1062
  ### Amazon Elasticsearch Service
1095
1063
 
1096
- Include `elasticsearch 1.0.15` or greater in your Gemfile.
1097
-
1098
- ```ruby
1099
- gem 'elasticsearch', '>= 1.0.15'
1100
- ```
1101
-
1102
1064
  Create an initializer `config/initializers/elasticsearch.rb` with:
1103
1065
 
1104
1066
  ```ruby
@@ -1108,7 +1070,7 @@ ENV["ELASTICSEARCH_URL"] = "https://es-domain-1234.us-east-1.es.amazonaws.com"
1108
1070
  To use signed request, include in your Gemfile:
1109
1071
 
1110
1072
  ```ruby
1111
- gem 'faraday_middleware-aws-signers-v4', '>= 0.1.9'
1073
+ gem 'faraday_middleware-aws-sigv4'
1112
1074
  ```
1113
1075
 
1114
1076
  and add to your initializer:
@@ -1147,10 +1109,6 @@ Create an initializer `config/initializers/elasticsearch.rb` with multiple hosts
1147
1109
 
1148
1110
  ```ruby
1149
1111
  ENV["ELASTICSEARCH_URL"] = "http://localhost:9200,http://localhost:9201"
1150
-
1151
- Searchkick.client_options = {
1152
- retry_on_failure: true
1153
- }
1154
1112
  ```
1155
1113
 
1156
1114
  See [elasticsearch-transport](https://github.com/elastic/elasticsearch-ruby/blob/master/elasticsearch-transport) for a complete list of options.
@@ -1192,7 +1150,7 @@ gem 'typhoeus'
1192
1150
  To reduce log noise, create an initializer with:
1193
1151
 
1194
1152
  ```ruby
1195
- Ethon.logger = Logger.new("/dev/null")
1153
+ Ethon.logger = Logger.new(nil)
1196
1154
  ```
1197
1155
 
1198
1156
  If you run into issues on Windows, check out [this post](https://www.rastating.com/fixing-issues-in-typhoeus-and-httparty-on-windows/).
@@ -1217,7 +1175,7 @@ class Product < ApplicationRecord
1217
1175
  end
1218
1176
  ```
1219
1177
 
1220
- **Note:** Non-string fields will always be filterable and should not be passed to this option.
1178
+ **Note:** Non-string fields are always filterable and should not be passed to this option.
1221
1179
 
1222
1180
  ### Parallel Reindexing
1223
1181
 
@@ -1535,8 +1493,6 @@ Reindex one record
1535
1493
  ```ruby
1536
1494
  product = Product.find(1)
1537
1495
  product.reindex
1538
- # or to reindex in the background
1539
- product.reindex_async
1540
1496
  ```
1541
1497
 
1542
1498
  Reindex multiple records
@@ -1666,7 +1622,7 @@ Eager load different associations by model
1666
1622
  Searchkick.search("*", index_name: [Product, Store], model_includes: {Product => [:store], Store => [:product]})
1667
1623
  ```
1668
1624
 
1669
- Run additional scopes on results [master]
1625
+ Run additional scopes on results
1670
1626
 
1671
1627
  ```ruby
1672
1628
  Product.search "milk", scope_results: ->(r) { r.with_attached_images }
@@ -1804,9 +1760,9 @@ RSpec.configure do |config|
1804
1760
  end
1805
1761
 
1806
1762
  config.around(:each, search: true) do |example|
1807
- Searchkick.enable_callbacks
1808
- example.run
1809
- Searchkick.disable_callbacks
1763
+ Searchkick.callbacks(true) do
1764
+ example.run
1765
+ end
1810
1766
  end
1811
1767
  end
1812
1768
  ```
@@ -1858,60 +1814,27 @@ Searchkick.index_suffix = ENV["TEST_ENV_NUMBER"]
1858
1814
 
1859
1815
  Check out [this great post](https://www.tiagoamaro.com.br/2014/12/11/multi-tenancy-with-searchkick/) on the [Apartment](https://github.com/influitive/apartment) gem. Follow a similar pattern if you use another gem.
1860
1816
 
1861
- ## Upgrading
1862
-
1863
- View the [changelog](https://github.com/ankane/searchkick/blob/master/CHANGELOG.md).
1864
-
1865
- Important notes are listed below.
1866
-
1867
- ### 2.0.0
1868
-
1869
- - Added support for `reindex` on associations
1870
-
1871
- #### Breaking Changes
1872
-
1873
- - Removed support for Elasticsearch 1 as it reaches [end of life](https://www.elastic.co/support/eol)
1874
- - Removed facets, legacy options, and legacy methods
1875
- - Invalid options now throw an `ArgumentError`
1876
- - The `query` and `json` options have been removed in favor of `body`
1877
- - The `include` option has been removed in favor of `includes`
1878
- - The `personalize` option has been removed in favor of `boost_where`
1879
- - The `partial` option has been removed in favor of `operator`
1880
- - Renamed `select_v2` to `select` (legacy `select` no longer available)
1881
- - The `_all` field is disabled if `searchable` option is used (for performance)
1882
- - The `partial_reindex(:method_name)` method has been replaced with `reindex(:method_name)`
1883
- - The `unsearchable` and `only_analyzed` options have been removed in favor of `searchable` and `filterable`
1884
- - `load: false` no longer returns an array in Elasticsearch 2
1885
-
1886
- ### 1.0.0
1887
-
1888
- - Added support for Elasticsearch 2.0
1889
- - Facets are deprecated in favor of [aggregations](#aggregations) - see [how to upgrade](#moving-from-facets)
1890
-
1891
- #### Breaking Changes
1892
-
1893
- - **ActiveRecord 4.1+ and Mongoid 3+:** Attempting to reindex with a scope now throws a `Searchkick::DangerousOperation` error to keep your from accidentally recreating your index with only a few records.
1894
-
1895
- ```ruby
1896
- Product.where(color: "brandy").reindex # error!
1897
- ```
1817
+ ## Elasticsearch 5 to 6 Upgrade
1898
1818
 
1899
- If this is what you intend to do, use:
1819
+ Elasticsearch 6 removes the ability to reindex with the `_all` field. Before you upgrade, we recommend disabling this field manually and specifying default fields on your models.
1900
1820
 
1901
- ```ruby
1902
- Product.where(color: "brandy").reindex(accept_danger: true)
1903
- ```
1904
-
1905
- - Misspellings are enabled by default for [partial matches](#partial-matches). Use `misspellings: false` to disable.
1906
- - [Transpositions](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) are enabled by default for misspellings. Use `misspellings: {transpositions: false}` to disable.
1907
-
1908
- ### 0.6.0 and 0.7.0
1909
-
1910
- If running Searchkick `0.6.0` or `0.7.0` and Elasticsearch `0.90`, we recommend upgrading to Searchkick `0.6.1` or `0.7.1` to fix an issue that causes downtime when reindexing.
1821
+ ```ruby
1822
+ class Product < ApplicationRecord
1823
+ searchkick _all: false, default_fields: [:name]
1824
+ end
1825
+ ```
1911
1826
 
1912
- ### 0.3.0
1827
+ If you need search across multiple fields, we recommend creating a similar field in your search data.
1913
1828
 
1914
- Before `0.3.0`, locations were indexed incorrectly. When upgrading, be sure to reindex immediately.
1829
+ ```ruby
1830
+ class Product < ApplicationRecord
1831
+ def search_data
1832
+ {
1833
+ all: [name, size, quantity].join(" ")
1834
+ }
1835
+ end
1836
+ end
1837
+ ```
1915
1838
 
1916
1839
  ## Elasticsearch Gotchas
1917
1840
 
@@ -1936,6 +1859,10 @@ end
1936
1859
 
1937
1860
  For convenience, this is set by default in the test environment.
1938
1861
 
1862
+ ## History
1863
+
1864
+ View the [changelog](https://github.com/ankane/searchkick/blob/master/CHANGELOG.md).
1865
+
1939
1866
  ## Thanks
1940
1867
 
1941
1868
  Thanks to Karel Minarik for [Elasticsearch Ruby](https://github.com/elasticsearch/elasticsearch-ruby) and [Tire](https://github.com/karmi/retire), Jaroslav Kalistsuk for [zero downtime reindexing](https://gist.github.com/jarosan/3124884), and Alex Leschenko for [Elasticsearch autocomplete](https://github.com/leschenko/elasticsearch_autocomplete).