searchkick 3.1.0 → 3.1.1

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/CONTRIBUTING.md +9 -7
  4. data/README.md +86 -24
  5. data/lib/searchkick/bulk_indexer.rb +1 -1
  6. data/lib/searchkick/index_options.rb +12 -0
  7. data/lib/searchkick/model.rb +2 -2
  8. data/lib/searchkick/query.rb +36 -21
  9. data/lib/searchkick/record_data.rb +2 -2
  10. data/lib/searchkick/results.rb +2 -2
  11. data/lib/searchkick/version.rb +1 -1
  12. metadata +8 -106
  13. data/.github/ISSUE_TEMPLATE.md +0 -7
  14. data/.gitignore +0 -22
  15. data/.travis.yml +0 -33
  16. data/Gemfile +0 -16
  17. data/Rakefile +0 -16
  18. data/benchmark/Gemfile +0 -24
  19. data/benchmark/index.rb +0 -99
  20. data/benchmark/search.rb +0 -48
  21. data/docs/Searchkick-3-Upgrade.md +0 -57
  22. data/searchkick.gemspec +0 -30
  23. data/test/aggs_test.rb +0 -217
  24. data/test/autocomplete_test.rb +0 -81
  25. data/test/boost_test.rb +0 -225
  26. data/test/callbacks_test.rb +0 -59
  27. data/test/ci/before_install.sh +0 -17
  28. data/test/errors_test.rb +0 -19
  29. data/test/gemfiles/activerecord42.gemfile +0 -7
  30. data/test/gemfiles/activerecord50.gemfile +0 -7
  31. data/test/gemfiles/activerecord51.gemfile +0 -7
  32. data/test/gemfiles/apartment.gemfile +0 -8
  33. data/test/gemfiles/cequel.gemfile +0 -8
  34. data/test/gemfiles/mongoid5.gemfile +0 -7
  35. data/test/gemfiles/mongoid6.gemfile +0 -12
  36. data/test/gemfiles/nobrainer.gemfile +0 -8
  37. data/test/gemfiles/parallel_tests.gemfile +0 -8
  38. data/test/geo_shape_test.rb +0 -171
  39. data/test/highlight_test.rb +0 -109
  40. data/test/index_test.rb +0 -168
  41. data/test/inheritance_test.rb +0 -82
  42. data/test/language_test.rb +0 -79
  43. data/test/marshal_test.rb +0 -13
  44. data/test/match_test.rb +0 -293
  45. data/test/misspellings_test.rb +0 -56
  46. data/test/model_test.rb +0 -40
  47. data/test/multi_search_test.rb +0 -37
  48. data/test/multi_tenancy_test.rb +0 -22
  49. data/test/order_test.rb +0 -40
  50. data/test/pagination_test.rb +0 -96
  51. data/test/partial_reindex_test.rb +0 -65
  52. data/test/query_test.rb +0 -43
  53. data/test/reindex_test.rb +0 -87
  54. data/test/reindex_v2_job_test.rb +0 -27
  55. data/test/routing_test.rb +0 -23
  56. data/test/should_index_test.rb +0 -32
  57. data/test/similar_test.rb +0 -28
  58. data/test/sql_test.rb +0 -190
  59. data/test/suggest_test.rb +0 -100
  60. data/test/support/kaminari.yml +0 -21
  61. data/test/synonyms_test.rb +0 -69
  62. data/test/test_helper.rb +0 -593
  63. data/test/where_test.rb +0 -249
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2353bcf562a8f814430f473f0356e65cc8275c5bb21267fc46b96004c8edd27c
4
- data.tar.gz: 5c570d53bc6d728a183de8ffb22056909ac748adebc6b436d2b8de785c3965fd
3
+ metadata.gz: b778411135d61db33ef8f82eb06990b41502d53cd5b2f4a21579f8c79b2f7aff
4
+ data.tar.gz: ba732ab1e72db7a9c5600bf99c3ae4b99d91cb47c97ad3ada0147888cb5e084f
5
5
  SHA512:
6
- metadata.gz: c0aa2359ff46b280d0cc87fe57cf809760de414e3e40d7f5cb3c33cd43124ef3ad7aba824aa87f43390a188983ae2c1dfecba141ddaa19ab27a1cb50f6368447
7
- data.tar.gz: bbf49af1a70667bdfa24ebee0227b0fa2b8d1738cfcbb860680d597a245d6860b1e5b56b978fc6b4aa9aa96e41bd20392e6e99116b7e69ff4a233a5480003709
6
+ metadata.gz: e4bb9b36b02989e29ed8adf179f45abf597ff91a63e23f442ab285f05523f15d8e00ff7a6fc634fca5553d6d91a05be467e589f8cf6e1b0de155b6db81c623fb
7
+ data.tar.gz: 417adb5009b35512b45c11024e4c9a413d713361a2bb0897b17e8c9128a788bcbb3b8df7801ef50a0fbae8269741e8a5f3c2405b4ddcdd0dab9f1ef914ef28bd
@@ -1,3 +1,12 @@
1
+ ## 3.1.1
2
+
3
+ - Added per-field misspellings
4
+ - Added `case_sensitive` option
5
+ - Added `stem` option
6
+ - Added `total_entries` option
7
+ - Fixed `exclude` option with match all
8
+ - Fixed `with_highlights` method
9
+
1
10
  ## 3.1.0
2
11
 
3
12
  - Added `:inline` as alias for `true` for `callbacks` and `mode` options
@@ -2,17 +2,15 @@
2
2
 
3
3
  First, thanks for wanting to contribute. You’re awesome! :heart:
4
4
 
5
- ## Questions
5
+ ## Help
6
6
 
7
- Use [Stack Overflow](https://stackoverflow.com/) with the tag `searchkick`.
7
+ We’re not able to provide support through GitHub Issues. If you’re looking for help with your code, try posting on [Stack Overflow](https://stackoverflow.com/).
8
8
 
9
- ## Feature Requests
9
+ All features should be documented. If you don’t see a feature in the docs, assume it doesn’t exist.
10
10
 
11
- Create an issue. Start the title with `[Idea]`.
11
+ ## Bugs
12
12
 
13
- ## Issues
14
-
15
- Think you’ve discovered an issue?
13
+ Think you’ve discovered a bug?
16
14
 
17
15
  1. Search existing issues to see if it’s been reported.
18
16
  2. Try the `master` branch to make sure it hasn’t been fixed.
@@ -32,6 +30,10 @@ If the above steps don’t help, create an issue.
32
30
  - 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
31
  - For exceptions, include the complete backtrace.
34
32
 
33
+ ## New Features
34
+
35
+ If you’d like to discuss a new feature, create an issue and start the title with `[Idea]`.
36
+
35
37
  ## Pull Requests
36
38
 
37
39
  Fork the project and create a pull request. A few tips:
data/README.md CHANGED
@@ -271,15 +271,17 @@ Product.search "back", fields: [:name], match: :word_start
271
271
 
272
272
  Available options are:
273
273
 
274
- ```ruby
275
- :word # default
276
- :word_start
277
- :word_middle
278
- :word_end
279
- :text_start
280
- :text_middle
281
- :text_end
282
- ```
274
+ Option | Matches | Example
275
+ --- | --- | ---
276
+ `:word` | entire word | `apple` matches `apple`
277
+ `:word_start` | start of word | `app` matches `apple`
278
+ `:word_middle` | any part of word | `ppl` matches `apple`
279
+ `:word_end` | end of word | `ple` matches `apple`
280
+ `:text_start` | start of text | `gre` matches `green apple`, `app` does not match
281
+ `:text_middle` | any part of text | `een app` matches `green apple`
282
+ `:text_end` | end of text | `ple` matches `green apple`, `een` does not match
283
+
284
+ The default is `:word`. The most matches will happen with `:word_middle`.
283
285
 
284
286
  ### Exact Matches
285
287
 
@@ -410,6 +412,14 @@ Turn off misspellings with:
410
412
  Product.search "zuchini", misspellings: false # no zucchini
411
413
  ```
412
414
 
415
+ Specify which fields can include misspellings with:
416
+
417
+ ```ruby
418
+ Product.search "zucini", fields: [:name, :color], misspellings: {fields: [:name]}
419
+ ```
420
+
421
+ > When doing this, you must also specify fields to search
422
+
413
423
  ### Bad Matches
414
424
 
415
425
  If a user searches `butter`, they may also get results for `peanut butter`. To prevent this, use:
@@ -645,7 +655,7 @@ Product.search "milk", boost_where: {orderer_ids: current_user.id}
645
655
 
646
656
  Autocomplete predicts what a user will type, making the search experience faster and easier.
647
657
 
648
- ![Autocomplete](https://raw.githubusercontent.com/ankane/searchkick/gh-pages/autocomplete.png)
658
+ ![Autocomplete](https://gist.github.com/ankane/b6988db2802aca68a589b31e41b44195/raw/40febe948427e5bc53ec4e5dc248822855fef76f/autocomplete.png)
649
659
 
650
660
  **Note:** To autocomplete on general categories (like `cereal` rather than product names), check out [Autosuggest](https://github.com/ankane/autosuggest).
651
661
 
@@ -711,7 +721,7 @@ Then add the search box and JavaScript code to a view.
711
721
 
712
722
  ### Suggestions
713
723
 
714
- ![Suggest](https://raw.githubusercontent.com/ankane/searchkick/gh-pages/recursion.png)
724
+ ![Suggest](https://gist.github.com/ankane/b6988db2802aca68a589b31e41b44195/raw/40febe948427e5bc53ec4e5dc248822855fef76f/recursion.png)
715
725
 
716
726
  ```ruby
717
727
  class Product < ApplicationRecord
@@ -730,7 +740,7 @@ products.suggestions # ["peanut butter"]
730
740
 
731
741
  [Aggregations](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html) provide aggregated search data.
732
742
 
733
- ![Aggregations](https://raw.githubusercontent.com/ankane/searchkick/gh-pages/facets.png)
743
+ ![Aggregations](https://gist.github.com/ankane/b6988db2802aca68a589b31e41b44195/raw/40febe948427e5bc53ec4e5dc248822855fef76f/facets.png)
734
744
 
735
745
  ```ruby
736
746
  products = Product.search "chuck taylor", aggs: [:product_type, :gender, :brand]
@@ -784,6 +794,12 @@ Minimum document count
784
794
  Product.search "apples", aggs: {store_id: {min_doc_count: 2}}
785
795
  ```
786
796
 
797
+ Script support
798
+
799
+ ```ruby
800
+ Product.search "*", aggs: {color: {script: {source: "'Color: ' + _value"}}}
801
+ ```
802
+
787
803
  Date histogram
788
804
 
789
805
  ```ruby
@@ -1045,7 +1061,7 @@ heroku addons:create bonsai
1045
1061
  heroku config:set ELASTICSEARCH_URL=`heroku config:get BONSAI_URL`
1046
1062
  ```
1047
1063
 
1048
- For Found:
1064
+ For Elastic Cloud (previously Found):
1049
1065
 
1050
1066
  ```sh
1051
1067
  heroku addons:create foundelasticsearch
@@ -1078,7 +1094,7 @@ Create an initializer `config/initializers/elasticsearch.rb` with:
1078
1094
  ENV["ELASTICSEARCH_URL"] = "https://es-domain-1234.us-east-1.es.amazonaws.com"
1079
1095
  ```
1080
1096
 
1081
- To use signed request, include in your Gemfile:
1097
+ To use signed requests, include in your Gemfile:
1082
1098
 
1083
1099
  ```ruby
1084
1100
  gem 'faraday_middleware-aws-sigv4'
@@ -1105,7 +1121,7 @@ rake searchkick:reindex CLASS=Product
1105
1121
  Create an initializer `config/initializers/elasticsearch.rb` with:
1106
1122
 
1107
1123
  ```ruby
1108
- ENV["ELASTICSEARCH_URL"] = "http://username:password@api.searchbox.io"
1124
+ ENV["ELASTICSEARCH_URL"] = "https://user:password@host"
1109
1125
  ```
1110
1126
 
1111
1127
  Then deploy and reindex:
@@ -1114,12 +1130,18 @@ Then deploy and reindex:
1114
1130
  rake searchkick:reindex CLASS=Product
1115
1131
  ```
1116
1132
 
1133
+ ### Data Protection
1134
+
1135
+ We recommend encrypting data at rest and in transit (even inside your own network). This is especially important if you send [personal data](https://en.wikipedia.org/wiki/Personally_identifiable_information) of your users to Elasticsearch.
1136
+
1137
+ Bonsai, Elastic Cloud, and Amazon Elasticsearch all support encryption at rest and HTTPS.
1138
+
1117
1139
  ### Automatic Failover
1118
1140
 
1119
1141
  Create an initializer `config/initializers/elasticsearch.rb` with multiple hosts:
1120
1142
 
1121
1143
  ```ruby
1122
- ENV["ELASTICSEARCH_URL"] = "http://localhost:9200,http://localhost:9201"
1144
+ ENV["ELASTICSEARCH_URL"] = "https://user:password@host1,https://user:password@host2"
1123
1145
  ```
1124
1146
 
1125
1147
  See [elasticsearch-transport](https://github.com/elastic/elasticsearch-ruby/blob/master/elasticsearch-transport) for a complete list of options.
@@ -1218,7 +1240,7 @@ Searchkick.reindex_status(index_name)
1218
1240
  You can also have Searchkick wait for reindexing to complete
1219
1241
 
1220
1242
  ```ruby
1221
- Searchkick.reindex(async: {wait: true})
1243
+ Product.reindex(async: {wait: true})
1222
1244
  ```
1223
1245
 
1224
1246
  You can use [ActiveJob::TrafficControl](https://github.com/nickelser/activejob-traffic_control) to control concurrency. Install the gem:
@@ -1427,7 +1449,7 @@ end
1427
1449
  And use the `body` option to search:
1428
1450
 
1429
1451
  ```ruby
1430
- products = Product.search body: {match: {name: "milk"}}
1452
+ products = Product.search body: {query: {match: {name: "milk"}}}
1431
1453
  ```
1432
1454
 
1433
1455
  **Note:** This replaces the entire body, so other options are ignored.
@@ -1466,23 +1488,29 @@ Searchkick.client
1466
1488
  To batch search requests for performance, use:
1467
1489
 
1468
1490
  ```ruby
1469
- fresh_products = Product.search("fresh", execute: false)
1470
- frozen_products = Product.search("frozen", execute: false)
1471
- Searchkick.multi_search([fresh_products, frozen_products])
1491
+ products = Product.search("snacks", execute: false)
1492
+ coupons = Coupon.search("snacks", execute: false)
1493
+ Searchkick.multi_search([products, coupons])
1472
1494
  ```
1473
1495
 
1474
- Then use `fresh_products` and `frozen_products` as typical results.
1496
+ Then use `products` and `coupons` as typical results.
1475
1497
 
1476
- **Note:** Errors are not raised as with single requests. Use the `error` method on each query to check for errors. Also, if you use the `below` option for misspellings, misspellings will be disabled.
1498
+ **Note:** Errors are not raised as with single requests. Use the `error` method on each query to check for errors.
1477
1499
 
1478
1500
  ## Multiple Indices
1479
1501
 
1480
- Search across multiple indices with:
1502
+ Search across multiple models/indices with:
1481
1503
 
1482
1504
  ```ruby
1483
1505
  Searchkick.search "milk", index_name: [Product, Category]
1484
1506
  ```
1485
1507
 
1508
+ Specify conditions for different indices
1509
+
1510
+ ```ruby
1511
+ where: {_or: [{_type: "product", in_stock: true}, {_type: "category", active: true}]}
1512
+ ```
1513
+
1486
1514
  Boost specific indices with:
1487
1515
 
1488
1516
  ```ruby
@@ -1656,6 +1684,22 @@ class Product < ApplicationRecord
1656
1684
  end
1657
1685
  ```
1658
1686
 
1687
+ Turn off stemming
1688
+
1689
+ ```ruby
1690
+ class Product < ApplicationRecord
1691
+ searchkick stem: false
1692
+ end
1693
+ ```
1694
+
1695
+ Turn on stemming for conversions
1696
+
1697
+ ```ruby
1698
+ class Product < ApplicationRecord
1699
+ searchkick stem_conversions: true
1700
+ end
1701
+ ```
1702
+
1659
1703
  Use a different [similarity algorithm](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-similarity.html) for scoring
1660
1704
 
1661
1705
  ```ruby
@@ -1664,6 +1708,16 @@ class Product < ApplicationRecord
1664
1708
  end
1665
1709
  ```
1666
1710
 
1711
+ Make search case-sensitive
1712
+
1713
+ ```ruby
1714
+ class Product < ApplicationRecord
1715
+ searchkick case_sensitive: true
1716
+ end
1717
+ ```
1718
+
1719
+ **Note:** If misspellings are enabled (default), results with a single character case difference will match. Turn off misspellings if this is not desired.
1720
+
1667
1721
  Change import batch size
1668
1722
 
1669
1723
  ```ruby
@@ -1691,6 +1745,14 @@ Add [request parameters](https://www.elastic.co/guide/en/elasticsearch/reference
1691
1745
  Product.search("carrots", request_params: {search_type: "dfs_query_then_fetch"})
1692
1746
  ```
1693
1747
 
1748
+ Set options across all models
1749
+
1750
+ ```ruby
1751
+ Searchkick.model_options = {
1752
+ batch_size: 200
1753
+ }
1754
+ ```
1755
+
1694
1756
  Reindex conditionally
1695
1757
 
1696
1758
  ```ruby
@@ -24,7 +24,7 @@ module Searchkick
24
24
  # to get the max _id without scripting since it's a string
25
25
 
26
26
  # TODO use primary key and prefix with table name
27
- relation = relation.where("id > ?", total_docs)
27
+ relation = relation.where("id > ?", index.total_docs)
28
28
  end
29
29
 
30
30
  relation = relation.select("id").except(:includes, :preload) if async
@@ -225,6 +225,18 @@ module Searchkick
225
225
  }
226
226
  end
227
227
 
228
+ if options[:case_sensitive]
229
+ settings[:analysis][:analyzer].each do |_, analyzer|
230
+ analyzer[:filter].delete("lowercase")
231
+ end
232
+ end
233
+
234
+ if options[:stem] == false
235
+ settings[:analysis][:analyzer].each do |_, analyzer|
236
+ analyzer[:filter].delete("searchkick_stemmer")
237
+ end
238
+ end
239
+
228
240
  settings = settings.symbolize_keys.deep_merge((options[:settings] || {}).symbolize_keys)
229
241
 
230
242
  # synonyms
@@ -3,10 +3,10 @@ module Searchkick
3
3
  def searchkick(**options)
4
4
  options = Searchkick.model_options.merge(options)
5
5
 
6
- unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :conversions, :default_fields,
6
+ unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :case_sensitive, :conversions, :default_fields,
7
7
  :filterable, :geo_shape, :highlight, :ignore_above, :index_name, :index_prefix, :inheritance, :language,
8
8
  :locations, :mappings, :match, :merge_mappings, :routing, :searchable, :settings, :similarity,
9
- :special_characters, :stem_conversions, :suggest, :synonyms, :text_end,
9
+ :special_characters, :stem, :stem_conversions, :suggest, :synonyms, :text_end,
10
10
  :text_middle, :text_start, :word, :wordnet, :word_end, :word_middle, :word_start]
11
11
  raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any?
12
12
 
@@ -19,7 +19,7 @@ module Searchkick
19
19
  :boost_by, :boost_by_distance, :boost_by_recency, :boost_where, :conversions, :conversions_term, :debug, :emoji, :exclude, :execute, :explain,
20
20
  :fields, :highlight, :includes, :index_name, :indices_boost, :limit, :load,
21
21
  :match, :misspellings, :model_includes, :offset, :operator, :order, :padding, :page, :per_page, :profile,
22
- :request_params, :routing, :scope_results, :select, :similar, :smart_aggs, :suggest, :track, :type, :where]
22
+ :request_params, :routing, :scope_results, :select, :similar, :smart_aggs, :suggest, :total_entries, :track, :type, :where]
23
23
  raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any?
24
24
 
25
25
  term = term.to_s
@@ -116,7 +116,8 @@ module Searchkick
116
116
  misspellings: @misspellings,
117
117
  term: term,
118
118
  scope_results: options[:scope_results],
119
- index_name: options[:index_name]
119
+ index_name: options[:index_name],
120
+ total_entries: options[:total_entries]
120
121
  }
121
122
 
122
123
  if options[:debug]
@@ -250,7 +251,7 @@ module Searchkick
250
251
  if fields != ["_all"]
251
252
  query[:more_like_this][:fields] = fields
252
253
  end
253
- elsif all
254
+ elsif all && !options[:exclude]
254
255
  query = {
255
256
  match_all: {}
256
257
  }
@@ -280,6 +281,15 @@ module Searchkick
280
281
  prefix_length = (misspellings.is_a?(Hash) && misspellings[:prefix_length]) || 0
281
282
  default_max_expansions = @misspellings_below ? 20 : 3
282
283
  max_expansions = (misspellings.is_a?(Hash) && misspellings[:max_expansions]) || default_max_expansions
284
+ misspellings_fields = misspellings.is_a?(Hash) && misspellings.key?(:fields) && misspellings[:fields].map { |f| "#{f}.#{@match_suffix}" }
285
+
286
+ if misspellings_fields
287
+ missing_fields = misspellings_fields - fields
288
+ if missing_fields.any?
289
+ raise ArgumentError, "All fields in per-field misspellings must also be specified in fields option"
290
+ end
291
+ end
292
+
283
293
  @misspellings = true
284
294
  else
285
295
  @misspellings = false
@@ -314,8 +324,10 @@ module Searchkick
314
324
  exclude_analyzer = nil
315
325
  exclude_field = field
316
326
 
327
+ field_misspellings = misspellings && (!misspellings_fields || misspellings_fields.include?(field))
328
+
317
329
  if field == "_all" || field.end_with?(".analyzed")
318
- shared_options[:cutoff_frequency] = 0.001 unless operator.to_s == "and" || misspellings == false
330
+ shared_options[:cutoff_frequency] = 0.001 unless operator.to_s == "and" || field_misspellings == false
319
331
  qs << shared_options.merge(analyzer: "searchkick_search")
320
332
 
321
333
  # searchkick_search and searchkick_search2 are the same for ukrainian
@@ -334,7 +346,7 @@ module Searchkick
334
346
  exclude_analyzer = analyzer
335
347
  end
336
348
 
337
- if misspellings != false && match_type == :match
349
+ if field_misspellings != false && match_type == :match
338
350
  qs.concat(qs.map { |q| q.except(:cutoff_frequency).merge(fuzziness: edit_distance, prefix_length: prefix_length, max_expansions: max_expansions, boost: factor).merge(transpositions) })
339
351
  end
340
352
 
@@ -372,13 +384,22 @@ module Searchkick
372
384
  end
373
385
  end
374
386
 
375
- payload = {
376
- dis_max: {
377
- queries: queries
387
+ # all + exclude option
388
+ if all
389
+ query = {
390
+ match_all: {}
391
+ }
392
+
393
+ should = []
394
+ else
395
+ payload = {
396
+ dis_max: {
397
+ queries: queries
398
+ }
378
399
  }
379
- }
380
400
 
381
- should.concat(set_conversions)
401
+ should.concat(set_conversions)
402
+ end
382
403
 
383
404
  query = payload
384
405
  end
@@ -487,9 +508,7 @@ module Searchkick
487
508
  ["_all"]
488
509
  elsif all && default_match == :phrase
489
510
  ["_all.phrase"]
490
- elsif term == "*"
491
- []
492
- elsif default_match == :exact
511
+ elsif term != "*" && default_match == :exact
493
512
  raise ArgumentError, "Must specify fields to search"
494
513
  else
495
514
  [default_match == :word ? "*.analyzed" : "*.#{default_match}"]
@@ -718,7 +737,7 @@ module Searchkick
718
737
  aggs = Hash[aggs.map { |f| [f, {}] }] if aggs.is_a?(Array) # convert to more advanced syntax
719
738
  aggs.each do |field, agg_options|
720
739
  size = agg_options[:limit] ? agg_options[:limit] : 1_000
721
- shared_agg_options = agg_options.slice(:order, :min_doc_count)
740
+ shared_agg_options = agg_options.except(:limit, :field, :ranges, :date_ranges, :where)
722
741
 
723
742
  if agg_options[:ranges]
724
743
  payload[:aggs][field] = {
@@ -735,19 +754,15 @@ module Searchkick
735
754
  }.merge(shared_agg_options)
736
755
  }
737
756
  elsif (histogram = agg_options[:date_histogram])
738
- interval = histogram[:interval]
739
757
  payload[:aggs][field] = {
740
- date_histogram: {
741
- field: histogram[:field],
742
- interval: interval
743
- }
744
- }
758
+ date_histogram: histogram
759
+ }.merge(shared_agg_options)
745
760
  elsif (metric = @@metric_aggs.find { |k| agg_options.has_key?(k) })
746
761
  payload[:aggs][field] = {
747
762
  metric => {
748
763
  field: agg_options[metric][:field] || field
749
764
  }
750
- }
765
+ }.merge(shared_agg_options)
751
766
  else
752
767
  payload[:aggs][field] = {
753
768
  terms: {