From 201a236362672fddff521f819d1e1795f51e508e Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Tue, 10 Mar 2020 15:15:24 -0700 Subject: [PATCH] Started nested support --- CHANGELOG.md | 4 ++++ lib/searchkick/index_options.rb | 4 ++++ lib/searchkick/model.rb | 2 +- test/models/product.rb | 8 +++++--- test/nested_test.rb | 11 +++++++++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 test/nested_test.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 2524f41..7227931 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.3.1 (unreleased) + +- Added `nested` option + ## 4.3.0 (2020-02-19) - Fixed `like` queries with `"` character diff --git a/lib/searchkick/index_options.rb b/lib/searchkick/index_options.rb index 0bf740d..0aec390 100644 --- a/lib/searchkick/index_options.rb +++ b/lib/searchkick/index_options.rb @@ -434,6 +434,10 @@ module Searchkick # http://www.elasticsearch.org/guide/reference/mapping/multi-field-type/ multi_field = dynamic_fields["{name}"].merge(fields: dynamic_fields.except("{name}")) + (options[:nested] || []).each do |field| + mapping[field] = {type: "nested"} + end + mappings = { properties: mapping, _routing: routing, diff --git a/lib/searchkick/model.rb b/lib/searchkick/model.rb index 8f29fe1..74ba0ec 100644 --- a/lib/searchkick/model.rb +++ b/lib/searchkick/model.rb @@ -5,7 +5,7 @@ module Searchkick unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :case_sensitive, :conversions, :deep_paging, :default_fields, :filterable, :geo_shape, :highlight, :ignore_above, :index_name, :index_prefix, :inheritance, :language, - :locations, :mappings, :match, :merge_mappings, :routing, :searchable, :settings, :similarity, + :locations, :mappings, :match, :merge_mappings, :nested, :routing, :searchable, :settings, :similarity, :special_characters, :stem, :stem_conversions, :suggest, :synonyms, :text_end, :text_middle, :text_start, :word, :wordnet, :word_end, :word_middle, :word_start] raise ArgumentError, "unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any? diff --git a/test/models/product.rb b/test/models/product.rb index efd8c47..1eabbc5 100644 --- a/test/models/product.rb +++ b/test/models/product.rb @@ -20,9 +20,10 @@ class Product highlight: [:name], filterable: [:name, :color, :description], similarity: "BM25", - match: ENV["MATCH"] ? ENV["MATCH"].to_sym : nil + match: ENV["MATCH"] ? ENV["MATCH"].to_sym : nil, + nested: [:categories] - attr_accessor :conversions, :user_ids, :aisle, :details + attr_accessor :conversions, :user_ids, :aisle, :details, :categories def search_data serializable_hash.except("id", "_id").merge( @@ -31,7 +32,8 @@ class Product location: {lat: latitude, lon: longitude}, multiple_locations: [{lat: latitude, lon: longitude}, {lat: 0, lon: 0}], aisle: aisle, - details: details + details: details, + categories: categories ) end diff --git a/test/nested_test.rb b/test/nested_test.rb new file mode 100644 index 0000000..788cea5 --- /dev/null +++ b/test/nested_test.rb @@ -0,0 +1,11 @@ +require_relative "test_helper" + +class NestedTest < Minitest::Test + def test_basic + store [ + {name: "Product A", categories: [{name: "bread roll"}, {name: "sausage meat"}]} + ] + assert_search "sausage", ["Product A"], fields: ["categories.name"] + assert_search "sausage roll", [], fields: ["categories.name"] + end +end -- libgit2 0.21.0