diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c27c85f..ee5230a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### New Features +* [#887](https://github.com/toptal/chewy/pull/887): Add support [runtime_mappings](https://www.elastic.co/guide/en/elasticsearch/reference/current/runtime-search-request.html). ([@TakuyaKurimoto](https://github.com/TakuyaKurimoto)) ### Changes ### Bugs Fixed diff --git a/README.md b/README.md index 096bdb57..55d24500 100644 --- a/README.md +++ b/README.md @@ -1171,6 +1171,16 @@ scope.each do |wrapper| end ``` +#### runtime_mappings + +You can define runtime fields in a search request as described [here](https://www.elastic.co/guide/en/elasticsearch/reference/current/runtime-search-request.html): + +```ruby +CitiesIndex.runtime_mappings( + field1: {type: 'keyword', :script=>{:lang => "painless", :source => "emit('some script here')"}} +) +``` + ### Rake tasks For a Rails application, some index-maintaining rake tasks are defined. diff --git a/lib/chewy/search/parameters/runtime_mappings.rb b/lib/chewy/search/parameters/runtime_mappings.rb new file mode 100644 index 00000000..b60a09a6 --- /dev/null +++ b/lib/chewy/search/parameters/runtime_mappings.rb @@ -0,0 +1,14 @@ +module Chewy + module Search + class Parameters + # Just a standard hash storage. Nothing to see here. + # + # @see Chewy::Search::Parameters::HashStorage + # @see Chewy::Search::Request#runtime_mappings + # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/runtime-search-request.html + class RuntimeMappings < Storage + include HashStorage + end + end + end +end diff --git a/lib/chewy/search/request.rb b/lib/chewy/search/request.rb index 27d5cdef..1254888a 100644 --- a/lib/chewy/search/request.rb +++ b/lib/chewy/search/request.rb @@ -25,7 +25,7 @@ class Request search_type preference limit offset terminate_after timeout min_score source stored_fields search_after load script_fields suggest aggs aggregations collapse none - indices_boost rescore highlight total total_count + indices_boost rescore highlight runtime_mappings total total_count total_entries indices types delete_all count exists? exist? find pluck scroll_batches scroll_hits scroll_results scroll_wrappers ignore_unavailable @@ -656,7 +656,23 @@ def load(options = nil) # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html # @param value [Hash] # @return [Chewy::Search::Request] - %i[script_fields indices_boost rescore highlight].each do |name| + # + # @!method runtime_mappings(value) + # Add a `runtime_mappings` part to the request. Further + # call values are merged to the storage hash. + # + # @example + # PlacesIndex + # .runtime_mappings(field1: {type: "keyword", :script=>{:lang=>"painless", :source=>"emit('some script here')"}}) + # .runtime_mappings(field2: {type: "keyword", :script=>{:lang=>"painless", :source=>"emit('some script here')"}}) + # # => {:runtime_mappings=>{ + # # "field1"=>{:type=>"keyword", :script=>{:lang=>"painless", :source=>"emit('some script here')"}}, + # # "field2"=>{:type=>"keyword", :script=>{:lang=>"painless", :source=>"emit('some script here')"}}}}}> + # @see Chewy::Search::Parameters::ScriptFields + # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/runtime-search-request.html + # @param value [Hash] + # @return [Chewy::Search::Request] + %i[script_fields indices_boost rescore highlight runtime_mappings].each do |name| define_method name do |value| modify(name) { update!(value) } end diff --git a/spec/chewy/search/parameters/runtime_mappings_spec.rb b/spec/chewy/search/parameters/runtime_mappings_spec.rb new file mode 100644 index 00000000..f3334739 --- /dev/null +++ b/spec/chewy/search/parameters/runtime_mappings_spec.rb @@ -0,0 +1,5 @@ +require 'chewy/search/parameters/hash_storage_examples' + +describe Chewy::Search::Parameters::RuntimeMappings do + it_behaves_like :hash_storage, :runtime_mappings +end diff --git a/spec/chewy/search/request_spec.rb b/spec/chewy/search/request_spec.rb index b73b9916..af004bac 100644 --- a/spec/chewy/search/request_spec.rb +++ b/spec/chewy/search/request_spec.rb @@ -284,7 +284,7 @@ specify { expect { subject.stored_fields(:foo) }.not_to change { subject.render } } end - %i[script_fields highlight].each do |name| + %i[script_fields highlight runtime_mappings].each do |name| describe "##{name}" do specify { expect(subject.send(name, foo: {bar: 42}).render[:body]).to include(name => {'foo' => {bar: 42}}) } specify do