Module: Chewy::Type::Mapping::ClassMethods
- Defined in:
- lib/chewy/type/mapping.rb
Instance Method Summary collapse
-
#field(*args, &block) ⇒ Object
Defines mapping field for current type.
-
#mappings_hash ⇒ Object
Returns compiled mappings hash for current type.
-
#root(options = {}, &block) ⇒ Object
Defines root object for mapping and is optional for type definition.
-
#template(*args) ⇒ Object
(also: #dynamic_template)
Defines dynamic template in mapping root objests.
Instance Method Details
#field(*args, &block) ⇒ Object
Defines mapping field for current type
class UsersIndex < Chewy::Index
define_type User do
# passing all the options to field definition:
field :full_name, type: 'string', analyzer: 'special'
end
end
The ‘type` is optional and defaults to `string` if not defined:
field :full_name
Also, multiple fields might be defined with one call and with the same options:
field :first_name, :last_name, analyzer: 'special'
The only special option in the field definition is ‘:value`. If no `:value` specified then just corresponding method will be called for the indexed object. Also `:value` might be a proc or indexed object method name:
class User < ActiveRecord::Base
def user_full_name
[first_name, last_name].join(' ')
end
end
field :full_name, type: 'string', value: :user_full_name
The proc evaluates inside the indexed object context if its arity is 0 and in present contexts if there is an argument:
field :full_name, type: 'string', value: -> { [first_name, last_name].join(' ') }
separator = ' '
field :full_name, type: 'string', value: ->(user) { [user.first_name, user.last_name].join(separator) }
If array was returned as value - it will be put in index as well.
field :tags, type: 'string', value: -> { .map(&:name) }
Fields supports nesting in case of ‘object` field type. If `user.quiz` will return an array of objects, then result index content will be an array of hashes, if `user.quiz` is not a collection association then just values hash will be put in the index.
field :quiz do
field :question, :answer
field :score, type: 'integer'
end
Nested fields are composed from nested objects:
field :name, value: -> { name_translations } do
field :ru, value: ->(name) { name['ru'] }
field :en, value: ->(name) { name['en'] }
end
Off course it is possible to define object fields contents dynamically but make sure evaluation proc returns hash:
field :name, type: 'object', value: -> { name_translations }
The special case is multi_field. If type options and block are both present field is treated as a multi-field. In that case field composition changes satisfy elasticsearch rules:
field :full_name, type: 'string', analyzer: 'name', value: ->{ full_name.try(:strip) } do
field :sorted, analyzer: 'sorted'
end
110 111 112 113 114 115 116 117 118 119 |
# File 'lib/chewy/type/mapping.rb', line 110 def field *args, &block = args. build_root unless root_object if args.size > 1 args.map { |name| field(name, ) } else (Chewy::Fields::Base.new(args.first, ), &block) end end |
#mappings_hash ⇒ Object
Returns compiled mappings hash for current type
150 151 152 |
# File 'lib/chewy/type/mapping.rb', line 150 def mappings_hash root_object ? root_object.mappings_hash : {} end |
#root(options = {}, &block) ⇒ Object
Defines root object for mapping and is optional for type definition. Use it only if you need to pass options for root object mapping, such as ‘date_detection` or `dynamic_date_formats`
class UsersIndex < Chewy::Index
define_type User do
# root object defined implicitly and optionless for current type
field :full_name, type: 'string'
end
end
class CarsIndex < Chewy::Index
define_type Car do
# explicit root definition with additional options
root dynamic_date_formats: ['yyyy-MM-dd'] do
field :model_name, type: 'string'
end
end
end
32 33 34 35 |
# File 'lib/chewy/type/mapping.rb', line 32 def root = {}, &block raise "Root is already defined" if root_object build_root(, &block) end |
#template(*args) ⇒ Object Also known as: dynamic_template
Defines dynamic template in mapping root objests
class CarsIndex < Chewy::Index
define_type Car do
template 'model.*', type: 'string', analyzer: 'special'
field 'model', type: 'object' # here we can put { ru: 'Мерседес', en: 'Mercedes' }
# and template will be applyed to this field
end
end
Name for each template is generated with the following rule: “template_#+ 1”.
template 'tit*', mapping_hash
template 'title.*', mapping_hash # dot in template causes "path_match" using
template /tit.+/, mapping_hash # using "match_pattern": "regexp"
template /title\..+/, mapping_hash # "\." - escaped dot causes "path_match" using
template /tit.+/, 'string', mapping_hash # "match_mapping_type" as the optionsl second argument
template template42: {match: 'hello*', mapping: {type: 'object'}} # or even pass a template as is
141 142 143 144 145 |
# File 'lib/chewy/type/mapping.rb', line 141 def template *args build_root unless root_object root_object.dynamic_template *args end |