Mapping
- mapping类似数据库中的schema的定义,作用如下
- 定 义索引中的字段的名称
- 定义字段的数据类型,例如字符串,数字,布尔
- 字段,倒排索引的相关配置,(Anlyzed or Not Analyed,Analyzer)
- mapping会把json文档应设成lucene所需要的扁平格式
- 一个mapping属于记一个索引的type
- 每个文档都属于一个type
- 一个type有一个mapping定义
- 7.0开始,不需要再mapping定义中指定type的信息
字段的数据类型
- 简单类型
- text / keyword
- date
- integer / floating
- boolean
- ipv4 / ipv6
- 复杂类型
- 对象类型
- 嵌套类型
- 特殊类型
- geo_point & geo_shape / percolator
Dynamic Mapping
- 在写入文档的时候,如果索引不存在,会自动创建索引
- dynamic mapping 的机制,使得我们无需手动定义mappings,es可以自动的根据文档信息,推算出字段的类型
- 推断有时候会出现错误,如地理位置信息
- 当类型如果设置不对时,会导致一些功能无法正常的运行,eg range查询
- 查看Mapping
- 类型的自动识别
- 字符串:
- 匹配日期格式设置为date,
- 字符串:
- 布尔值 :boolean
- 能否更改mapping的字段类型
- 两种情况
- 新增字段
- dynamic 设置为 true,一旦有新增字段的文档写入,mapping也同时被更新
- dynamic 设置为false,mapping不会被更新,新增字段无法被索引,但是信息会出现在_source中
- dynamic 设置成strict,文档写入失败
- 对已有字段,一旦已经有数据写入,就不再支持字段定义的修改
- lucene实现的倒排索引,一旦生成后,就无法修改
- 如果必须要修改字段的类型,必须要reindex,重建索引
- 新增字段
- 两种情况
- 控制dynamic mappings
- true:文档可索引,字段可索引,mapping可更新
- false:文档可索引,字段不可索引,mapping不可更新
- stric:文档不可索引
显示定义 Mapping
- 自定义mapping的建议
- 可以参考api手册,纯手写
- 为了减少工作量,减少出错概率,可以依照以下步骤
- 创建一个临时的index,写入一些样本数据
- 通过访问mapping api 获得零食index的动态mapping定义
- 修改后用该配置创建新的索引
- 删除临时索引
- 控制字段收否被索引
- index - 控制当前字段是否被索引,默认为true,如果设置成false,该字段不可被搜索
- index Options
- 四种不同级别的index options配置,可以控制倒排索引记录的内容
- docs - 记录doc id
- freqs - 记录doc id 和term frequencles
- position - 记录doc id / term frequenceles / term position
- offsets - doc id / term frequencies / term position / character offects
- text 默认巨鹿级别为postions, 其他为doc
- 记录的内容越多,占用的空间越大
- 四种不同级别的index options配置,可以控制倒排索引记录的内容
- null_vlaue
- 需要对null值实现搜索
- mapping文件中,字段进行null_value设置默认值为NULL等
- 只有keyword类型支持设定null_value
- 需要对null值实现搜索
- copy_to
- 满足特定的搜索需求
- copy_to将字段的树枝拷贝到目标字段,实现类似_all的作用
- copy_to的目标字段不出现在_source中
数组类型
- es中不提供专门的数组类型,但是任何字段,都可以包含多个多个相同个类型的数值
多字段类型
- 多字段特性
- 使用不同的analyzer
- 不同语言
- pinyin字段的搜索
- 还支持为搜索和索引指定不同的analyzer
- exact value vs full text
- exact value:包括数字/日期/具体一个字符(eg "apple store")
- es中的keyword
- 在索引时,不需要做特殊的分词处理
- es为每一个字段创建一个倒排索引
- 全文本,非结构化的数据文本
- es中的text
- exact value:包括数字/日期/具体一个字符(eg "apple store")
自定义分词器
- 当es自带的分词器无法满足需要的时候,可以自定义分词器,通过组合不同的组件实现
- character filter
- tokenizer
- token filter
- character filter
- 在tokennizer之前对文本进行处理,例如增加删除及替换字符。可以配置多个character filter。会影响tokenizer的position和offset信息
- 一些自带的character filter
- html strip:去除html标签
- mapping:字符串替换
- pattern replace:正则匹配替换
- tokenizer
- 将原始的文本按照一定的规则,切分为词
- es内置的tokenizers
- whitspace / standard / uax_url_email / pattern / keyword / path hierachy
- 可以用java 开发插件,实现自己的tokenizer
- token filter
- 将tokenizer输出的单词(term),进行增加,修改,删除
- 自带的token filters
- lowercase / stop / synonym
- 自定义eg: