Mapping

本文详细介绍了Elasticsearch的mapping,包括mapping类型、字段数据类型(如text、keyword、date等)、动态mapping、详尽mapping及如何更新字段mapping。重点讨论了如何定义字符串字段的全文搜索、数字类型的索引以及地理信息数据类型。还提到了动态mapping和自定义详尽mapping的重要性,以及废弃的mapping types。
摘要由CSDN通过智能技术生成

mapping是定义文档及其字段是如何存储和索引的程序。例如,使用mapping定义:

  • 哪个字符串字段应该视为全文字段
  • 哪个字段包含数字,日期,或地理位置
  • 日期的格式
  • 自定义规则来控制动态添加字段

mapping type

每个索引都有mapping type来决定文档如何被索引。mapping type包含:

  • meta-fields: 比如_index, _type, _id, _source字段,用来定制文档相关的元数据
  • fields or properties:相关文档的字段列表或者properties

字段数据类型

每个字段都有数据类型,可以是如下:

  • 简单的类型:text, keyword, date, long, double, boolean, ip
  • 支持JSON这种层次结构的:object, nested
  • 专门的类型:geo_point, geo_shape, completion

根据不同的目的以不同的方式来索引相同的字段通常很有用。比如,同样的字段可以索引为text类型以便进行全文搜索,也可以作为keyword类型用来排序或聚合。或者同样的值使用不同的分词器。

大部分字段都支持fields参数的多字段搜索。

核心数据类型

  • 字符串

    PUT my_index
    {
         
      "mappings": {
         
        "properties": {
         
          "full_name": {
         
            "type":  "text"
          }
        }
      }
    }
    
    • text 用于全文索引,会被分词处理。适用于文章内容,产品介绍之类的信息。可以接收以下参数:

      • analyzer 指定分词器,同时适用于索引时和搜索时(除非被search_analyzer覆盖),默认值是索引默认的分词器,或者standard分词器
      • boost 字段级别的查询时提升(权重),接收浮点数,默认是1.0
      • eager_global_ordinals 刷新时是否重新加载全局顺序?默认是false。建议对经常用于词条聚合的此段启动该特性。
      • fielddata 该字段是否能使用内存字段数据用来排序,聚合,或者脚本计算?默认false
      • fielddata_frequency_filter 专家设置:当fielddata启用时,是否允许决定哪些值被载入内存,默认情况下加载所有值
      • fields 多字段(multi-fields)允许出于不同的目的以多种方式来索引相同的字段,比如一个字段用于搜索,一个多字段用于排序和聚合,或者对同样的字符串使用不同的分词器
      • index 字段是否可被搜索,默认true
      • index_options 索引中应该存储什么信息用于搜索和高亮,默认是positions
      • index_prefixes 如果启用,2~5个字符的词条前缀将会被索引为一个单独的字段,有助于提高前缀搜索的效率。
      • index_phrases 如果允许,词组会被索引为单独的字段。这使得精确的短语查询更高效。注意,只有当停用词没有被移除时,这个才最有效,因为包含停用词的短语不会使用子字段,而是使用标准的短语查询。默认值是false
      • norms 打分时是否考虑字段长度,默认true
      • position_increment_gap 略
      • store 字段值是否在_source字段外,被独立存储和检索,默认false
      • search_analyzer 指定搜索时的分词器,默认是analyzer 参数的设置
      • search_quote_analyzer 没啥用
      • similarity 使用哪种打分算法,默认是BM25
      • term_vector 略
    • keyword 关键词,适用于标签,状态码,邮件地址,域名,商标等。用于过滤,排序,和聚合,关键词只支持精确搜索。

      PUT my_index
      {
             
        "mappings": {
             
          "properties": {
             
            "tags": {
             
              "type":  "keyword"
            }
          }
        }
      }
      

      支持的参数如下:

      • ignore_above 默认是2147483647,超过这一长度的字符串无法索引。但是默认的动态mapping会覆盖这个值为ignore_above:256
      • 其他和text类似,具体参见官网
  • 数字

    • long -2^63 ~ 2^63-1

    • integer -2^31 ~ 2^31-1

    • short -32768 ~ 32768

    • byte -128 ~ 127

    • double 64位双精度浮点数

    • float 32位双精度浮点数

    • half_float 16位双精度浮点数

    • scaled_float 略

      PUT my_index
      {
             
        "mappings": {
             
          "properties": {
             
            "number_of_bytes": {
             
              "type": "integer"
            },
            "time_in_seconds": {
             
              "type": "float"
            },
            "price": {
             
              "type": "scaled_float",
              "scaling_factor": 100
            }
          }
        }
      }
      
    • 数字类型的字段支持以下参数:

      • coerce 强制转换字符串为数字,截断分数为整数,默认是true
      • 其他参数参考官网
  • date,JSON没有日期类型,因此ES中的日期可以是

    • 包含日期格式的字符串,比如:"2015-01-01" or "2015/01/01 12:10:30"
    • 时间的毫秒数
    • 时间的整数

    在ES内部,日期会被转换为UTC时间(如果指定了时区),并且存储为代表时间毫秒数的长整数。对于日期的查询会被转化为对这个长整数的范围查询,结果再转化为以该字段定义的日期格式的字符串。日期格式可以自定义,如果没有指定format,会使用如下默认值:

    "strict_date_optional_time||epoch_millis"
    

    这意味它可以接受strict_date_optional_time支持的格式,或者毫秒数,例如:

    PUT my_index
    {
         
      "mappings": {
         
        &#
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值