Mapping

目录

什么是Mapping?

字段的数据类型

Dynamic Mapping

类型的自动识别

更改Mapping的字段类型

新增加字段

已有字段

原因

实例

Dynamic为true

Dynamic为false

Dynamic设为strict

显式定义Mapping

自定义Mapping的一些建议

控制当前字段是否被索引

Index Options

null_value

copy_to

数组类型

多字段特性

Exact Values    vs    Full Text

自定义分词

Character Filter

Tokenizer

Token Filters

实例


什么是Mapping?

Mapping类似于数据库中的schema定义,作用如下:

  • 定义索引中的字段的名称
  • 定义字段的数据类型,如字符串,数字,布尔等
  • 字段,倒排索引的相关配置(是否分析,用那种分析器)

Mapping会把json文档映射程Lucene所需要的扁平格式

一个Mapping属于一个索引的type

  • 每个文档都属于一个type
  • 一个type由一个mapping定义
  • 7.0开始,不需要在mapping中指定type信息

 

字段的数据类型

简单类型

  • Text/Keyword
  • Date
  • Integer/Floating
  • Boolean
  • IPv4 & IPv6

复杂类型-对象和嵌套对象

特殊类型 

  • geo_point
  • geo_shape

 

Dynamic Mapping

写入文档的时候,如果索引不存在,会自动创建索引

Dynamic Mapping的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出文档类型

推算有时候并不准确,比如我们将 false加上双引号,则会推算成text,而不是boolean

 

类型的自动识别

 

更改Mapping的字段类型

新增加字段

  • Dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
  • Dynamic设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
  • Dynamic设为strict,文档写入失败

已有字段

  • 一旦已经有数据写入,就不再支持修改字段定义
  • luence实现的倒排索引,一旦生成后,就不允许修改

原因

  • 如果修改了字段的数据类型,会导致已被索引的数据无法被搜索
  • 但是如果是增加新的字段,就不会有这样的影响

 

实例

Dynamic为true

可以增加字段,新增字段的数据也可以被索引

 

Dynamic为false

Dynamic设为strict

发现无法写入

 

 

显式定义Mapping

自定义Mapping的一些建议

<1>可以参考API手册,纯手写

<2>为了减少输入的工作量,减少出错效率,可以依照一下步骤

  • 创建一个临时的Index,写入一些样本数据
  • 通过访问Mapping API 获得该临时文件的动态Mapping定义
  • 修改后,使用该配置创建你的索引
  • 删除临时索引

 

控制当前字段是否被索引

Index,控制当前字段是否被索引。默认为true,如果为false,则该字段不能被搜索

 

Index Options

 

null_value

需要对null值实现搜索

只有keyword类型支持Null_Value

 

copy_to

_all在7中被copy_to代替

满足一些特定的搜索需求

copy_to将字段的数值拷贝到目标字段,实现类似_all的作用

copy_to的目标字段不出现在_source中

 

 

 

数组类型

es不提供专门的数组类型,但是任何字段,都可以包含多个相同类型的数值

 

多字段特性

<1>实现精确匹配,增加一个keyword字段。keyword是不做任何处理,就把他当成一个单独的term输出

<2>使用不同的analyzer

  • 为不同的索引提供不同的analyzer
  • 拼音的搜索

Exact Values    vs    Full Text

Exact Values

包括具体的数字,日期,具体的字符串(App Store)

es中的keyword

不需要被分词

全文本,非结构化的文本数据

es中的text

 

自定义分词

当es自带的分词器无法满足时,可以自定义分词器,通过组合不同的组件(Character Filter,Tokenizer,Token Filter)实现

Character Filter

<1>在Tokenizer之前对文本进行处理,例如增加删除及替换字符,可以配置多个Character Filters,会影响Tokenizer position和offset信息

<2>一些自带的Character Filters

  • html strip 去除html标签
  • mapping 字符串替换
  • pattern replace 正则匹配替换

Tokenizer

<1>将原始的文本按照一定的规则,且分为词(term or token)

<2>es内置的Tokenizers

  • whitespace/standard/uax_url_email/keyword/path_hierarchy

<3>可以用java开发插件,实现自己的Tokenizer

Token Filters

<1>将Tokenizer输出的单词,进行增加,删除,修改

<2>自带的Token Filters

  • lowcase/stop/synonmy(添加近义词)

 

网络爬虫抓取的数据,就可以用html_strip将标签剥离

实例

<1>html标签剥离,并实现精确匹配

<2>实现char_filter替换符号

<3>实现搜索任何一级的目录,都可以得到相应的结果

<4>移出stop words

<5>自定义分词器

 

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        #自定义分析器名称
        "my_custom_analyzer":{
          #类型,custom,自定义  
          "type":"custom",
          #分词器,emotions,自定义,过滤表请
          "char_filter":["emotions"],
          #tokenizer自定义,过滤标点符号
          "tokenizer":"punctuation",
          #token filter 自定义english_stop,
          "filter":[
            "lowercase","english_stop"
            ]
        }
      },
      "tokenizer": {
        "punctuation":{
          "type":"pattern",
          "pattern":[".,!?"]
        }
      },
      "char_filter": {
        "emotions":{
          "type":"mapping",
          "mappings":["?=>happy"]
        }
      },
      "filter": {
        "english_stop":{
          "type":"stop",
          "stopwords":"english"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer":"my_custom_analyzer",
  "text":"i am very ? !?"
}
{
  "tokens" : [
    {
      "token" : "i am very happy",
      "start_offset" : 0,
      "end_offset" : 12,
      "type" : "word",
      "position" : 0
    }
  ]
}

 

 

mapping character filter 映射字符过滤器

接收键和值的映射,每当遇到与键相同的字符串时,就用该键关联的值替换他们

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "٠ => 0",
            "١ => 1",
            "٢ => 2",
            "٣ => 3",
            "٤ => 4",
            "٥ => 5",
            "٦ => 6",
            "٧ => 7",
            "٨ => 8",
            "٩ => 9"
          ]
        }
      }
    }
  }
}

 

 

 

 

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值