1. 什么是mapping
-
mapping 类似数据库中的schema的定义,作用如下
-
定义索引中字段的名称
-
定义字段的类型,例如字符串,数字,布尔...
-
字段,倒排索引的相关配置,(analyzed or not analyzed,analyzer)
-
-
mapping会把json文档映射成Lucene所需要的扁平格式
-
一个mapping 属于一个索引的type
-
一个type有一个mapping定义
-
7.0开始,不需要在mapping中指定type的信息
-
-
查看mapping 信息
- GET movies/_mappings
2. mapping中字段类型
-
简单类型
-
Text/Keyword
-
Date
-
Integer/Floating
-
Boolean
-
Ipv4/Ipv6
-
-
复杂类型-对象和嵌套对象
- 对象类型/嵌套类型
-
特殊类型
- geo_point & geo_shape / percolator (地理信息)
3. 什么是dynamic mapping
-
在写入文档时,如果索引不存在,会自动创建索引
-
dynamic mapping 的机制,使得我们无需手动创建mappings,es会根据文档信息,推算出字段的类型
-
有时候推算的不对,比如地理位置
-
当类型设置不对时,会导致一些功能无法使用,比如range查询
4. 能否修改mapping类型
- 两种情况
-
新增加字段
-
当dynamic 设为true时,一旦有新增字段的文档写入时,mapping也同时被更新
-
当dynamic 设为false时,mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
-
当dynamic设为strict时,文档写入失败
-
-
对已有字段,一旦有数据写入,就不在支持修改字段定义
- lucene 实现的倒排索引,一旦生成后,就不允许呗修改
-
如果希望改变字段类型,必须reindex api,重建索引
-
- 原因
-
如果修改了字段的数据类型,会导致被索引的数据无法被搜索
-
但是是如果新增加的字段,就不会有这样的影响
-
- mapping参数的设置
-
控制当前字段是否被索引,默认是true,如果设置为false,则不可被索引"name":{"type":"text","index":false}
-
四种不同级别的 index options配置,可以控制倒排索引记录的内容
-
docs -记录文档id
-
freqs -记录文档id 和term frequencies
-
positions -记录文档id/ term frequencies/ term position
-
offsets -记录文档id/ term freqencies/ term position /character offects
-
Text 类型默认positions,其他默认为docs
-
记录内容越多,占用存储空间越大
-
-
null_value
-
需要对null值实现搜索
-
只有keyword类型支持设定 Null_Value
-
"name":{"type":"keyword","null_value":"NULL"}
-
-
copy_to 设置
-
_all 在7中已被copy_to所代替
-
满足一些特定的搜索需求
-
copy_to将字段的数值copy到目标字段,实现类似_all的作用
-
copy_to的目标字段不会出现在_source中
-
"firstName":{"type":"text","copy_to":"fullName"}
-
"lastName":{"type":"text","copy_to":"fullName"}
-
GET users/_serach?q=fullName:(sun jianlei)
-
-
-
数组类型
- es中不提供专门的数组类型,但是任何字段都可以包含多个相同类型的数据
6. index template
-
index template-帮助你设定mappings和settings,并按照一定的规则,自动匹配到新建的索引之上
-
模板仅在一个索引被新创建时,才会产生作用。修改模板不会影响已创建的索引。
-
可以设定多个索引模板,这些设置会被“merge”到一起
-
可以指定“order” 的数值,控制“merging” 过程
-
-
PUT _template/template_default {"index_patterns":["*"],"order":0,"version":1,"settings":{ "number_of_shards":1,"number_of_replicas":1, "mappings":{"date_detection":false,"numeric_detection":true} }}---转换日期为false,转换为int为true
-
查看template信息
-
GET /_template/template_default
-
GET /_template/temp*
-
GET testtemplate/_mapping
-
GET testtemplate/_setting
-
7. dynamic template
-
根据es识别数据类型,结合字段名称,来动态设定字段类型
-
所有字符串类型都设定为keyword,或者关闭keyword字段
-
is开头的字段都设置成boolean
-
long_开头的都设置成long类型
-
8. 什么是聚合(aggregation)
-
es除搜索以外,提供的针对es数据进行统计分析的功能
-
实时性高
-
hadoop(T+1)
-
-
通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档
-
尖沙咀和香港岛的客房数量
-
不同的价格区间,可预订的经济型酒店和五星级酒店的数量
-
-
高性能,只需要一个语句,就可以从es中得到分析结果
- 无需在客户端自己实现逻辑去分析
9. 集合的分类
-
bucket aggergation -一些列满足特定条件 文档的集合,相当于group
-
metric aggergation -一些数学运算,可以对文档字段进行统计分析,可以算出最大值,最小值和平均值,相当于count
-
pipeline aggergation -对其它聚合结果进行二次聚合
-
matrix aggergation -支持多个字段的操作并提供一个结果矩阵