定义
- Mapping类似数据库中的schema定义,主要作用是定义索引中的字段,包括
字段名称、字段类型和字段倒排索引的相关设置(分词器和字段是否被索引)
- Mapping会把JSON文档映射成Lucene所需要的扁平格式。
- 字段类型:
- 简单类型:Text/Keyword、Date、Integer/Floating、Boolean、IPv4 & IPv6
- 复杂类型:对象类型/嵌套类型
- 特殊类型:geo_point & geo_shape/percolator
Dynamic Mapping
- 在写入文档时,如果索引不存在,会自动创建索引,由于有Dynamic Mapping的存在,Elasticsearch会自动根据文档信息推算出字段类型。
- 但是有时候会推算的不正确,比如地理位置信息。
- 如果类型不对,会导致一些功能无法正常运行,比如Range查询
- 类型的自动识别规则:
JSON类型 | Elasticsearch类型 |
---|---|
字符串 | 如果匹配日期类型,则设置为Date;如果开启了数字设置,则可以把一串数字设置为long或float,该选项默认关闭;其他情况会设置为Text,并且增加keyword字段 |
布尔值 | boolean |
浮点数 | float |
整数 | long |
对应 | Object |
数组 | 由第一个非空数值的类型所决定 |
空值 | 忽略 |
能否更改字段类型
- 新增加字段:
- Dynamic设置为true,一旦有新增字段的文档写入,Mapping也同时被更新。
- Dynamic设置为false,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中。
- Dynamic设置成Strict,文档写入失败。
- 对于已有的字段,一但已经有数据写入,就不再支持修改字段定义。
- Lucene实现的倒排索引,一旦生成后,就不允许修改。
- 如果希望改变字段类型,必须重建索引。
能否索引\Dynamic设置 | true | false | strict |
---|---|---|---|
文档可索引 | YES | YES | NO |
字段可索引 | YES | NO | NO |
Mapping被更新 | YES | NO | NO |
- 当dynamic设置为false,存在新增字段的数据写入,该数据可以被索引,但是新增字段不可以。
手动设置Mapping
index
控制当前字段是否被索引。默认为true。- Index Options索引选项包含四个级别,可以控制倒排索引记录的内容。
- docs:记录doc id
- freqs:记录doc id和term frequencies
- postions:记录doc id、term frequencies、term position
- offsets:记录doc id、term frequencies、term position、character offsets
- Text类型默认使用postions,其他默认docs
- 记录越多,占用存储约大。
- 如果需要对Null值实现搜索,可以指定
null_value
,只有keyword类型支持。 copy_to
可以将字段数值拷贝到目标字段,比如将firstName和lastName拷贝到name,copy_to的目标字段不出现在_source中。- 关于数组,es没有提供专门的数组类型,字段类型是数组第一个元素的类型。
多字段特性
- 可以为字段增加子字段,并指定分词方式。
- 可以支持不同语言,支持为搜索和索引使用不同的analyzer。
- 精确值和全文本的比较:
- Exact Value: 包括数字、日期、具体字符串。es中的keyword。不需要被分词
- Full Text:全文本,非结构化的文本数据。es中的text。
自定义分词器
Character Filters
:在Tokenizer之前对文本进行处理、例如增删替换字符;可以配置多个Character Filters。会影响Tokenizer的position和offset的信息;自带的Character Filters如:html strip,去除html标签;mapping,字符串替换;pattern replace,正则替换。Tokenizer
:将原始文本按照一定规则切分为词;内置的Tokenizers如:whitespace 空格分词、uax_url_email 邮箱分词、pattern 正则、keyword 不分词、path hierarchy 文件路径。Token Filters
:将Tokenizer输出的term进行增删改;自带的Token Filters如:lowercase 变小写、stop 去除停用词;synonym 添加近义词。
- 创建自定义分词器