2.elasticsearch中的mapping
mapping 顾名思义,代表了映射关系。是文档中字段和数据类型的映射关系
为什么要了解mapping
虽然elasticsearch中已尽有的动态mapping(Dynamic Mapping),而且新增字段默认也会添加新的mapping,但是毕竟是机器,有时会推算的不对,比如地理位置信息,特殊格式化的日期类型等。这时,如果需要es提供排序、聚合等查询功能,就不能满足我们的需求。
什么是mapping
- 通过手动设置mapping,我们可以
- 定义文档里字段的数据类型
- 定义字段的名称
- 定义对应字段的是否索引
- 定义对应字段的分词方式
- mapping会把JSON文档文档映射成Lucene所需要的扁平格式
- 一个mapping属于一个索引的type
- 每个文档都属于一个Type
- 一个type又一个mapping定义
- 7.0开始,不需要在mapping定义中指定type信息,因为默认每个索引只有一个type叫"_doc"
查询mapping
设置mapping
Dynamic Mapping
什么是动态mapping
在写入文档时,如果索引不存在,会自动创建索引,字段类型的自动识别如下:
JSON类型 | Elastic search类型 |
---|---|
字符串 | 1、匹配日期格式,设置成Date 2、配置数子设置为float或者long,该选项默认关闭3、设置为text,并且增加keyword字段,超过256位 不分词 |
布尔值 | boolean |
浮点数 | float |
整数 | long |
对象 | object |
数组 | 由第一个非空数值的类型做决定 |
空值 | 忽略 |
-
dynamic属性默认为true,新增字段时会自动创建mapping
-
dynamic属性被设置为false时,新增字段不会创建mapping,但是数据会存储,无法根据字段条件查询,但是该字段会会被match_all查询处理
-
dynamic属性被设置为strict时,数据写入直接出错
es中字段对应的数据类型
- 简单类型
- text/keyword,对应json中的String,一般会设置字段为text,然后新建个keyword子字段,设置为keyword类型
- text类型被用来索引长文本,在建立索引前会将这些文本进行分词,转化为词的组合,建立索引。允许es来检索这些词语。text类型不能用来排序和聚合。
- Keyword类型不需要进行分词,可以被用来检索过滤、排序和聚合。keyword 类型字段只能用本身来进行检索
- date
- long, integer, short, byte, double, float
- boolean
- IPv4&IPv6
- text/keyword,对应json中的String,一般会设置字段为text,然后新建个keyword子字段,设置为keyword类型
- 复杂类型-对象和嵌套对象
- 对象类型/嵌套类型(n)
- 特殊类型
- geo_point&geo_shape/percolator
如何设置自定义mapping
常见的属性
- index 控制当前字段是否被索引,默认为true,如果设置成false,该字段不可被搜索
- index_options 控制倒排索引记录的内容
- docs 记录doc id
- freqs 记录doc id 和term frequencies
- positions 记录doc id/term frequencies/term position
- offsets 记录doc id/term frequencies/term position/character offects
- null_value 需要对字段为null值实现搜索
- 只有keyword类型支持设定为null_value
- copy_to
- _all在7+版本中被copy_t所替代
- 将字段内容拷贝到目标字段,查询时可以用目标字段作为查询条件,但是不会出现_source中
- fields
- 在字段下新增一个字段,可以自定义类型,使用不同的analyzer
- 可以用来实现以拼音方式搜索中文字段
- analyzer 分词器
- standard 默认分词器,按词切分,小写处理
- simple 按照非字母切分(符号被过滤),小写处理
- stop 小写处理,停用词过滤(the、a、is)
- whitespace 按照空格切分,不转小写
- keyword 不分词,直接将输入当作输出
- patter 正则表达式,默认\W+(非字符分隔)
- language 提供了30多种常见语言的分词器(english、german)
- 中文分词 icu_analyzer、ik、thulac
什么是分词器
分词器分为三部分,分别担任不同的工作
- character filters 对文本进行预处理,如去除html标签、字符串替换、正则匹配替换
- tokenizer 将文本按照一定规则,切分为词
- token filter 将tokenizer切分的词进行增加、修改、删除操作(添加近义词,复数改单数,小写)
设置自定义的分词器
可以将分词器的三个组成部分,自己搭配,实现自定义,也可以用java实现tokenizer插件
设置索引模版和动态模版
比如索引是日志时,每天增加一个索引,那么设置索引模版可以自动按照模版生成索引mapping,设置分片。
index template
- 帮助你设定mapping和setting,并按照一定的规则,自动匹配到新创建的索引之上
- 模版仅在一个索引创建时产生作用,修改模版不会影响已创建的索引
- 可以设定多个索引模版,这些设置会被“merge”在一起
- 可以指定“order”的数值,控制“merging”的过程
当一个索引被创建时
- 应用elasticsearch默认的settings和mappings
- 应用order数值低的index template中的设定
- 应用order数值高的,之前的设定会被覆盖
- 应用创建索引时用户指定的setting和mappings,覆盖之前模版中的设定
dynamic template(感觉用到的不多)
- 根据elasticsearch识别的数据类型,结合字段名称,对一个索引来动态设定字段类型,比如
- 所有的字符串类型都设置成keyword
- is开头的字段都设置成boolean
- long开头的都设置成long类型
__EOF__

本文作者:赛博朋克V
本文链接:https://www.cnblogs.com/pengliblogs/p/17946589.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/pengliblogs/p/17946589.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律