1.索引模板 IndexTemplate
可以看到setting是用来设定集群存储的,mapping是用来定义具体的索引设置.
这里需要注意一下order 的值
这个规定,使我们可以找到到底使用的是哪个索引模板中的设置. 上面的就是顺序.
也就是说先去配置默认的设定,如果有模板则去寻找较低的order,用较低的order的模板覆盖默认模板,
再去找order较高的模板,然后用它将order较低的模板覆盖掉,如果创建索引时,显示的指定了mappings,则用其覆盖掉之前的设定,
总之.优先级就是显示指定的mappings > order较高的mappings >order较低的mappings >默认的mappings
看下面的demo:
查看mapping:
可以看到someDate字段没有被探测为日期类型,而是设置成了text,而someNumber则被numeric_detection 探测出是数字类型,被设置成了long.
查看settings
这时可以看到 分片数与备份数都是2
下面是手动指定settings
可以看到,5已经设置成功
2. dynamicTemplate
DynamicTemplate 是更加聚焦于文本的,可以为每一个字段,或者说是每一种字段(通过匹配规则数组),设置具体的mapping,类似于关系型数据库的mapping了,而且可以更加符合我们的习惯
eg2:
有点像触发器,或者是存储过程
这里有个问题:在执行上面步骤后,通过
GET my_index/_doc/1 查询得到的结果:
没有full_name字段,但是通过
GET my_index/_search?q=full_name:JOhN
和
GET my_index/_search?q=full_name:lufei
都可以查到该文档,
带着这个问题我们查下文档:
主要显示 3点:
一.相当于复制到一个数组类型的字段中,而不是覆盖掉
The copy_to parameter allows you to copy the values of multiple fields into a group field, which can then be queried as a single field. For instance, the first_name and last_name fields can be copied to the full_name field,
copy_to参数允许您将多个字段的值复制到一个组字段中,然后可以作为单个字段进行查询。例如,可以将first_name和last_name字段复制到full_name字段.
二. 这个是对第一点的解释,其实就是相当于存储了一个数组
The first_name and last_name fields can still be queried for the first name and last name respectively, but the full_name field can be queried for both first and last names.
“名”和“姓”字段仍然可以分别查询“名”和“姓”,但“全名”字段可以同时查询“名”和“姓”。
三.总结
It is the field value which is copied, not the terms (which result from the analysis process).
它只是复制了值,但不是字段(这是分词过程的结果)
The original _source field will not be modified to show the copied values.
不会修改原始源字段以显示复制的值。(这就是问题的答案了)
那么这又会引发一个问题,如果文档中存在了这个字段,值还是原来的值,mapping中是怎样设定的呢?
(先留下悬念)
The same value can be copied to multiple fields, with "copy_to": [ "field_1", "field_2" ]
同一个值可以复制到多个字段,其中“copy_to”:[“field_1”,“field_2”]
You cannot copy recursively via intermediary fields such as a copy_to on field_1 to field_2 and copy_to on field_2 to field_3 expecting indexing into field_1 will eventuate in field_3, instead use copy_to directly to multiple fields from the originating field.
不能通过中介字段递归复制,如FieldIto字段Field1到Field2,Copyto to Field2到Field3,以期盼field_1 的值能存在field_3中,来代替直接复制到多个字段的用法, 也就是说只能存在两级,
四,我们回过头来,来测试一下之前留下的悬念:
如果文档中存在了这个字段,值还是原来的值,mapping中是怎样设定的呢?
首先,我们在原来的索引中添加一个带full_name字段(数字型)的文档
查看mapping
没变化,只有一个full_name字段的mapping设定且与原来的一样
那么我们再测试先让显示的full_name字段出现,(之前是通过copy_to隐式的创建了full_name的mapping)
删除原来的索引,再创建,起初的mapping显示:
这时还没有 full_name字段的mapping,然后创建一个文档只有full_name字段,还是数值类型的;
mapping 显示的是long型
再创建一个 文档让其通过copy_to 过程
报错了,也就是说其实通过copy_to建的字段mapping与通过文档默认生成的是一个,至于为什么现在报错了而之前没报错,是因为 long类型可以转为text类型,但text类型不能自动转为long类型.