美文网首页
Elasticsearch 篇之Mapping 设置

Elasticsearch 篇之Mapping 设置

作者: 青衣敖王侯 | 来源:发表于2019-06-27 21:34 被阅读0次

    ElasticSearch之mapping设置
    1.mapping类似数据库中的表结构定义,主要作用如下:
    定义Index下的字段名
    定义字段的类型,比如数值型、字符串型、布尔型
    定义倒排索引相关的配置,比如是否索引、记录position等
    API:curl -uelastic:changeme -XGET http://172.21.30.11:10200/_mapping或者curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_mapping?pretty

    2.自定义mapping,其中mappings是关键词,doc是type名称,“text"是字段类型,properties下面是字段名称和类型定义:
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
    {
    "mappings":{
    "doc":{
    "dynamic":false,
    "properties":{
    "title":{
    "type":"text"
    },
    "name":{
    "type":"keyword"
    },
    "age":{
    "type":"integer"
    }
    }
    }
    }
    }'
    Mapping中的字段类型一旦设定后,禁止直接修改,原因是Lucence实现的倒排索引生成后不允许修改,除非重新建立新的索引,然后做reindex操作。但是允许新增字段。通过dynamic参数来控制字段的新增:

    • true(默认)允许自动新增字段
    • false不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
    • strict 文档不能写入,报错

    2.1.copy_to

    • 将该字段的值复制到目标字段,实现类似_all的作用
    • 不会出现在_sources中,只用来搜索
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
      {
      "mappings":{
      "doc":{
      "properties":{
      "last_name":{
      "type":"text",
      "copy_to":"full_name"
      },
      "first_name":{
      "type":"text",
      "copy_to":"full_name"
      },
      "full_name":{
      "type":"text"
      }
      }
      }
      }
      }'

    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index/doc/1?pretty -d '{
    "first_name":"John",
    "last_name":"Smith"
    }'

    curl -uelastic:changeme -XGET http://172.21.30.11:10200/my_index/_search?pretty -d '
    {
    "query":{
    "match":{
    "full_name":{
    "query":"John Smith",
    "operator":"and"
    }
    }
    }
    }'

    2.2 index
    控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索.当身份证号和手机号这样的敏感信息被搜索的时候,可以设置为false,这样就可以不用建立倒排索引节省空间
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
    {
    "mappings":{
    "doc":{
    "properties":{
    "cookie":{
    "type":"text",
    "index":"false"
    }
    }
    }
    }
    }'

    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index/doc/1?pretty -d '{
    "cookie":"name=alfred"
    }'

    curl -uelastic:changeme -XGET http://172.21.30.11:10200/my_index/_search?pretty -d '
    {
    "query":{
    "match":{
    "cookie":"name"
    }
    }
    }'

    2.3index_options用于控制倒排索引记录的内容,有如下4中配置

    • docs 只记录doc id
    • freqs 记录doc id和term frequencies
    • positions 记录doc id、term frequencies和term position
    • offsets 记录doc id、term frequencies、term position和character offsets
      text类型默认配置为positions,其他默认为docs
      记录内容越多,占用空间越大
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
      {
      "mappings":{
      "doc":{
      "properties":{
      "cookie":{
      "type":"text",
      "index_options":"offsets"
      }
      }
      }
      }
      }'
      2.4null_value
      当字段遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值。可以通过设定该值设定字段的默认值。
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
      {
      "mappings":{
      "my_type":{
      "properties":{
      "status_code":{
      "type":"keyword",
      "null_value":"NULL"
      }
      }
      }
      }
      }'

    3.数据类型
    核心数据类型

    • 字符串型 text、keyword
    • 数值型 long、integer、short、byte、double、float、half_float、scaled_float
    • 日期类型date
    • 布尔类型 boolean
    • 二进制类型 binary
    • 范围类型 integer_range、float_range、long_range、double_range、date_range
      复杂数据类型
    • 数组类型 array
    • 对象类型 object
    • 嵌套类型 nested object
      地理位置数据类型
    • geo_point
    • geo_shape
      专用类型
    • 记录ip
    • 实现自动补全completion
    • 记录分次数token_count
    • 记录字符串hash值 murmur3
    • percolator
    • join
      多字段特性 multi-fields
      允许对同一个字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索,只需要在人名中新增一个字段为pinyin即可
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
      {
      "mappings":{
      "doc":{
      "properties":{
      "username":{
      "type":"text",
      "fields":{
      "pinyin":{
      "type":"text",
      "analyzer":"pinyin"
      }
      }
      }
      }
      }
      }
      }'

    4.dynamic Mapping
    es可以自动识别文档字段类型,从而降低用户使用成本。es是依靠json文档的字段类型来实现自动识别字段类型,支持的类型有:
    null:忽略
    boolean:boolean
    浮点类型:float
    整数:long
    object: object
    array:由第一个非null值的类型决定
    string: 匹配为日期则设为date类型(默认开启)匹配为数字的话设为float或long类型(默认关闭)设为text类型,并附带keyword的子字段

    4.1日期的自动识别可以自行配置日期格式,以满足各种需求

    • 默认是["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
    • strict_date_optional_time是ISO datetime的格式,完整格式类似如下面:
      • YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
    • dynamic_date_formats 可以自定义日期类型
    • date_detection可以关闭日期自动识别的机制
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
      {
      "mappings":{
      "my_type":{
      "dynamic_date_formats":["MM/dd/yyyy"]
      }
      }
      }'

    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index/my_type/1?pretty -d '{
    "create_date":"09/25/2015"
    }'

    curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_mapping?pretty

    4.2字符串是数字时,默认不会自动识别为整型,因为字符串中出现数字时完全合理的

    • numeric_detection可以开启字符串中数字的自动识别,如下所示:
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
      {
      "mappings":{
      "my_type":{
      "numeric_detection":true
      }
      }
      }'

    5.Dynamic Template
    允许根据es自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果:

    • 所有字符串类型都设定为keyword类型,即默认不分词
    • 所有以message开头的字段都设定为text类型,即分词
    • 所有以long_开头的字段都设定为long类型
    • 所有自动匹配为double类型的都设定为float类型,以节省空间
      API:
      dynamic_templates是数组,可指定多个匹配规则
      string_as_keywords是template的名称
      match_mapping_type表示匹配规则
      mapping设置mapping信息
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
      {
      "mappings":{
      "doc":{
      "dynamic_templates":[
      {
      "string_as_keywords":{
      "match_mapping_type":"string",
      "mapping":{
      "type":"keyword"
      }
      }
      }
      ]
      }
      }
      }'

    匹配规则一般有如下几个参数:

    • match_mapping_type匹配es自动识别的字段类型,如boolean,long,string等
    • match,unmatch匹配字段名
    • path_match,path_unmatch匹配路径
      假设我们希望以message开头的字段都设置为text类型
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
      {
      "mappings":{
      "doc":{
      "dynamic_templates":[
      {
      "message_as_text":{
      "match_mapping_type":"string",
      "match":"message*",
      "mapping":{
      "type":"text"
      }
      }
      }
      ],
      写properties。。。。。
      }
      }
      }'

    6.自定义mapping的建议
    自定义Mapping的操作步骤如下:
    1.写入一条文档到es的临时索引中,获取es自动生成的mapping
    2.修改步骤1得到的mapping,自定义相关配置
    3.使用步骤2的mapping穿件实际所需索引

    7.索引模板,英文为Index Template,主要用于在新建索引时自动应用预先设定的配置,简化索引创建的操作步骤

    • 可以设定索引的配置和mapping
    • 可以有多个模板,根据order设置,order大的覆盖小的配置
      curl -uelastic:changeme -XPUT http://172.21.30.11:10200/_template/test_template
      {
      "index_patterns":["te","bar"],
      "order":0,
      "settings":{
      "number_of_shards":1
      },
      "mappings":{
      "doc":{
      "_source":{
      "enabled":false
      }
      "properties":{
      "name":{
      "type":"keyword"
      }
      }
      }
      }
      }'

    相关文章

      网友评论

          本文标题:Elasticsearch 篇之Mapping 设置

          本文链接:https://www.haomeiwen.com/subject/kemdcctx.html