【Elasticsearch】5. Mapping && Setting

2020-12-21 17:32:49 浏览数 (1)

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
    • 记录的内容越多,占用的空间越大
  • null_vlaue
    • 需要对null值实现搜索
      • mapping文件中,字段进行null_value设置默认值为NULL等
    • 只有keyword类型支持设定null_value
  • 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

自定义分词器

  • 当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:

0 人点赞