精华内容
下载资源
问答
  • 14. Elasticsearch动态映射-1
    千次阅读
    2022-04-07 11:05:41

    14.1 映射

    • 类型和字段的信息存储(包含)在映射(mapping)中
      • Elasticsearch支持以下简单字段类型:

    14.2 映射规则

    • Elasticsearch将使用动态映射猜测字段类型,这类型来自于JSON的基本数据类型,使用以下规则:

    • 查看映射
    GET /gb/_mapping/tweet
    

    14.3 动态映射

    • Elasticsearch最重要的功能之一是不必首先创建index、定义映射type和定义field ,只需为文档编制index,index、type和field将自动显示:
      • 创建数据index、_doc映射type和名为count且数据type为long的field
    PUT data/_doc/1 
    { "count": 5 }
    
    • 新field的自动检测和添加称为动态映射,可以自定义动态映射规则以满足目的:
      • 动态field映射(Dynamic field mappings) ◼ 管理动态场检测的规则
      • 动态模板(Dynamic templates) ◼ 为动态添加的field配置映射的自定义规则
      • Index templates允许为automatically or explicitly创建的新索引配置默认映射、设置和别名

    14.4 动态field映射

    • 当 Elasticsearch 在文档中检测到新field时,它默认动态地将该field添加到type映射中,由dynamic参数控制此行为
    • 可以通过将dynamic参数设置为true或明确指示 Elasticsearch 根据传入的文档动态创建field runtime
      • 当启用动态field映射时,Elasticsearch 使用下表中的规则来确定如何映射每个field的数据type

    • 可以在文档和object级别禁用动态映射
      • 将dynamic参数设置为 false忽略新field,并strict在 Elasticsearch 遇到未知field时拒绝文档
    • 使用 update mapping API 更新dynamic 现有field的设置
    • 可以为 date detection 和 numeric detection自定义动态field映射规则
      • 要定义可应用于其他动态field的自定义映射规则,需使用dynamic_templates

    14.4.1 Date detection

    • 如果date_detection启用(默认),则检查新的stringfield,以查看其内容是否与动态日期格式中指定的任何日期模式匹配 dynamic_date_formats
      • 如果找到匹配项,date将添加一个具有相应格式的新日期field
    • 默认值为dynamic_date_formats:
    [ "strict_date_optional_time", "yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
    
    • 例如:
    PUT my-index-000001/_doc/1
    {
    "create_date": "2015/09/02"
    }
    GET my-index-000001/_mapping
    

    14.4.2 Disabling date detection

    • 可以通过设置date_detection为禁用动态日期检测false
    PUT my-index-000001
    {
    "mappings": {
    "date_detection": false
    }}
    PUT my-index-000001/_doc/1 
    {
    "create": "2015/09/02"
    }
    

    14.4.3 Customizing detected date formats

    • dynamic_date_formats可以自定义以支持所需的 date formats:
    PUT my-index-000001
    {
    "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
    }}
    PUT my-index-000001/_doc/1
    {
    "create_date": "09/25/2015"
    }
    

    14.4.4 Numeric detection

    • 虽然JSON支持本机floating point和integer data types,但某些应用程序或语言有时可能会将数字呈现为string
    • 通常正确的解决方案是显式映射这些field,但可以启用Numeric detection(默认情况下禁用)以自动执行此操作:
    PUT my-index-000001
    {
      "mappings": {
        "numeric_detection": true
      }
    }
    
    PUT my-index-000001/_doc/1
    {
      "my_float": "1.0", 
      "my_integer": "1" 
    }
    

    大数据视频推荐:
    CSDN
    大数据语音推荐:
    ELK7 stack开发运维
    企业级大数据技术应用
    大数据机器学习案例之推荐系统
    自然语言处理
    大数据基础
    人工智能:深度学习入门到精通

    更多相关内容
  • 在线NoC测试的动态映射技术的优化
  • 通过动态映射矩阵嵌入知识图
  • docker动态映射运行的container端口,最近做项目,对于docker动态映射运行的container端口的资料有必要记录下,以便以后在用到, Docker自带了EXPOSE命令,可以通过编写dockerfile加-p参数方便的映射Container内部...
  • 文章目录1.ElasticSearch 映射1.1 映射分类1.2 类型推断2.ElasticSearch 字段类型2.1 核心类型2.1.1 字符串类型2.1.2 数字类型2.1.3 日期类型2.1.4 布尔类型(boolean)2.1.5 二进制类型(binary)2.1.6 范围类型2.2...


    ElasticSearch 系列教程我们前面已经连着发了三篇了,今天第四篇,我们来聊一聊 Es 中的动态映射、静态映射以及四种不同的字段类型。

    本文是松哥所录视频教程的一个笔记,笔记简明扼要,完整内容小伙伴们可以参考视频,视频下载链接:https://pan.baidu.com/s/1oKiV7FRkppZnMAmRGNNrGg 提取码: p3sx

    1.ElasticSearch 映射

    映射就是 Mapping,它用来定义一个文档以及文档所包含的字段该如何被存储和索引。所以,它其实有点类似于关系型数据库中表的定义。

    1.1 映射分类

    动态映射

    顾名思义,就是自动创建出来的映射。es 根据存入的文档,自动分析出来文档中字段的类型以及存储方式,这种就是动态映射。

    举一个简单例子,新建一个索引,然后查看索引信息:

    image-20201106201219878

    在创建好的索引信息中,可以看到,mappings 为空,这个 mappings 中保存的就是映射信息。

    现在我们向索引中添加一个文档,如下:

    PUT blog/_doc/1
    {
      "title":"1111",
      "date":"2020-11-11"
    }
    

    文档添加成功后,就会自动生成 Mappings:

    image-20201106201516427

    可以看到,date 字段的类型为 date,title 的类型有两个,text 和 keyword。

    默认情况下,文档中如果新增了字段,mappings 中也会自动新增进来。

    有的时候,如果希望新增字段时,能够抛出异常来提醒开发者,这个可以通过 mappings 中 dynamic 属性来配置。

    dynamic 属性有三种取值:

    • true,默认即此。自动添加新字段。
    • false,忽略新字段。
    • strict,严格模式,发现新字段会抛出异常。

    具体配置方式如下,创建索引时指定 mappings(这其实就是静态映射):

    PUT blog
    {
      "mappings": {
        "dynamic":"strict",
        "properties": {
          "title":{
            "type": "text"
          },
          "age":{
            "type":"long"
          }
        }
      }
    }
    

    然后向 blog 中索引中添加数据:

    PUT blog/_doc/2
    {
      "title":"1111",
      "date":"2020-11-11",
      "age":99
    }
    

    在添加的文档中,多出了一个 date 字段,而该字段没有预定义,所以这个添加操作就回报错:

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "strict_dynamic_mapping_exception",
            "reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
          }
        ],
        "type" : "strict_dynamic_mapping_exception",
        "reason" : "mapping set to strict, dynamic introduction of [date] within [_doc] is not allowed"
      },
      "status" : 400
    }
    

    动态映射还有一个日期检测的问题。

    例如新建一个索引,然后添加一个含有日期的文档,如下:

    PUT blog/_doc/1
    {
      "remark":"2020-11-11"
    }
    

    添加成功后,remark 字段会被推断是一个日期类型。

    image-20201106203240406

    此时,remark 字段就无法存储其他类型了。

    PUT blog/_doc/1
    {
      "remark":"javaboy"
    }
    

    此时报错如下:

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "mapper_parsing_exception",
            "reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'"
          }
        ],
        "type" : "mapper_parsing_exception",
        "reason" : "failed to parse field [remark] of type [date] in document with id '1'. Preview of field's value: 'javaboy'",
        "caused_by" : {
          "type" : "illegal_argument_exception",
          "reason" : "failed to parse date field [javaboy] with format [strict_date_optional_time||epoch_millis]",
          "caused_by" : {
            "type" : "date_time_parse_exception",
            "reason" : "Failed to parse with all enclosed parsers"
          }
        }
      },
      "status" : 400
    }
    

    要解决这个问题,可以使用静态映射,即在索引定义时,将 remark 指定为 text 类型。也可以关闭日期检测。

    PUT blog
    {
      "mappings": {
        "date_detection": false
      }
    }
    

    此时日期类型就回当成文本来处理。

    静态映射

    略。

    1.2 类型推断

    es 中动态映射类型推断方式如下:

    JSON 中的数据自动推断出来的数据类型
    null没有字段被添加
    true/falseboolean
    浮点数字float
    数字long
    JSON 对象object
    数组数组中的第一个非空值来决定
    stringtext/keyword/date/double/long 都有可能

    2.ElasticSearch 字段类型

    2.1 核心类型

    2.1.1 字符串类型

    • string:这是一个已经过期的字符串类型。在 es5 之前,用这个来描述字符串,现在的话,它已经被 text 和 keyword 替代了。
    • text:如果一个字段是要被全文检索的,比如说博客内容、新闻内容、产品描述,那么可以使用 text。用了 text 之后,字段内容会被分析,在生成倒排索引之前,字符串会被分词器分成一个个词项。text 类型的字段不用于排序,很少用于聚合。这种字符串也被称为 analyzed 字段。
    • keyword:这种类型适用于结构化的字段,例如标签、email 地址、手机号码等等,这种类型的字段可以用作过滤、排序、聚合等。这种字符串也称之为 not-analyzed 字段。

    2.1.2 数字类型

    类型取值范围
    long-263到263-1
    integer-231到231-1
    short-215到215-1
    byte-27到27-1
    double64 位的双精度 IEEE754 浮点类型
    float32 位的双精度 IEEE754 浮点类型
    half_float16 位的双精度 IEEE754 浮点类型
    scaled_float缩放类型的浮点类型
    • 在满足需求的情况下,优先使用范围小的字段。字段长度越短,索引和搜索的效率越高。
    • 浮点数,优先考虑使用 scaled_float。

    scaled_float 举例:

    PUT product
    {
      "mappings": {
        "properties": {
          "name":{
            "type": "text"
          },
          "price":{
            "type": "scaled_float",
            "scaling_factor": 100
          }
        }
      }
    }
    

    2.1.3 日期类型

    由于 JSON 中没有日期类型,所以 es 中的日期类型形式就比较多样:

    • 2020-11-11 或者 2020-11-11 11:11:11
    • 一个从 1970.1.1 零点到现在的一个秒数或者毫秒数。

    es 内部将时间转为 UTC,然后将时间按照 millseconds-since-the-epoch 的长整型来存储。

    自定义日期类型:

    PUT product
    {
      "mappings": {
        "properties": {
          "date":{
            "type": "date"
          }
        }
      }
    }
    

    这个能够解析出来的时间格式比较多。

    PUT product/_doc/1
    {
      "date":"2020-11-11"
    }
    
    PUT product/_doc/2
    {
      "date":"2020-11-11T11:11:11Z"
    }
    
    
    PUT product/_doc/3
    {
      "date":"1604672099958"
    }
    

    上面三个文档中的日期都可以被解析,内部存储的是毫秒计时的长整型数。

    2.1.4 布尔类型(boolean)

    JSON 中的 “true”、“false”、true、false 都可以。

    2.1.5 二进制类型(binary)

    二进制接受的是 base64 编码的字符串,默认不存储,也不可搜索。

    2.1.6 范围类型

    • integer_range
    • float_range
    • long_range
    • double_range
    • date_range
    • ip_range

    定义的时候,指定范围类型即可:

    PUT product
    {
      "mappings": {
        "properties": {
          "date":{
            "type": "date"
          },
          "price":{
            "type":"float_range"
          }
        }
      }
    }
    

    插入文档的时候,需要指定范围的界限:

    PUT product
    {
      "mappings": {
        "properties": {
          "date":{
            "type": "date"
          },
          "price":{
            "type":"float_range"
          }
        }
      }
    }
    

    指定范围的时,可以使用 gt、gte、lt、lte。

    2.2 复合类型

    2.2.1 数组类型

    es 中没有专门的数组类型。默认情况下,任何字段都可以有一个或者多个值。需要注意的是,数组中的元素必须是同一种类型。

    添加数组是,数组中的第一个元素决定了整个数组的类型。

    2.2.2 对象类型(object)

    由于 JSON 本身具有层级关系,所以文档包含内部对象。内部对象中,还可以再包含内部对象。

    PUT product/_doc/2
    {
      "date":"2020-11-11T11:11:11Z",
      "ext_info":{
        "address":"China"
      }
    }
    

    2.2.3 嵌套类型(nested)

    nested 是 object 中的一个特例。

    如果使用 object 类型,假如有如下一个文档:

    {
      "user":[
        {
          "first":"Zhang",
          "last":"san"
        },
        {
          "first":"Li",
          "last":"si"
        }
        ]
    }
    

    由于 Lucene 没有内部对象的概念,所以 es 会将对象层次扁平化,将一个对象转为字段名和值构成的简单列表。即上面的文档,最终存储形式如下:

    {
    "user.first":["Zhang","Li"],
    "user.last":["san","si"]
    }
    

    扁平化之后,用户名之间的关系没了。这样会导致如果搜索 Zhang si 这个人,会搜索到。

    此时可以 nested 类型来解决问题,nested 对象类型可以保持数组中每个对象的独立性。nested 类型将数组中的每一饿对象作为独立隐藏文档来索引,这样每一个嵌套对象都可以独立被索引。

    {
    {
    "user.first":"Zhang",
    "user.last":"san"
    },{
    "user.first":"Li",
    "user.last":"si"
    }
    }
    

    优点

    文档存储在一起,读取性能高。

    缺点

    更新父或者子文档时需要更新更个文档。

    2.3 地理类型

    使用场景:

    • 查找某一个范围内的地理位置
    • 通过地理位置或者相对中心点的距离来聚合文档
    • 把距离整个到文档的评分中
    • 通过距离对文档进行排序

    2.3.1 geo_point

    geo_point 就是一个坐标点,定义方式如下:

    PUT people
    {
      "mappings": {
        "properties": {
          "location":{
            "type": "geo_point"
          }
        }
      }
    }
    

    创建时指定字段类型,存储的时候,有四种方式:

    PUT people/_doc/1
    {
      "location":{
        "lat": 34.27,
        "lon": 108.94
      }
    }
    
    PUT people/_doc/2
    {
      "location":"34.27,108.94"
    }
    
    PUT people/_doc/3
    {
      "location":"uzbrgzfxuzup"
    }
    
    PUT people/_doc/4
    {
      "location":[108.94,34.27]
    }
    

    注意,使用数组描述,先经度后纬度。

    地址位置转 geo_hash:http://www.csxgame.top/#/

    2.3.2 geo_shape

    GeoJSONElasticSearch备注
    Pointpoint一个由经纬度描述的点
    LineStringlinestring一个任意的线条,由两个以上的点组成
    Polygonpolygon一个封闭多边形
    MultiPointmultipoint一组不连续的点
    MultiLineStringmultilinestring多条不关联的线
    MultiPolygonmultipolygon多个多边形
    GeometryCollectiongeometrycollection几何对象的集合
    circle一个圆形
    envelope通过左上角和右下角两个点确定的矩形

    指定 geo_shape 类型:

    PUT people
    {
      "mappings": {
        "properties": {
          "location":{
            "type": "geo_shape"
          }
        }
      }
    }
    

    添加文档时需要指定具体的类型:

    PUT people/_doc/1
    {
      "location":{
        "type":"point",
        "coordinates": [108.94,34.27]
      }
    }
    

    如果是 linestring,如下:

    PUT people/_doc/2
    {
      "location":{
        "type":"linestring",
        "coordinates": [[108.94,34.27],[100,33]]
      }
    }
    

    2.4 特殊类型

    2.4.1 IP

    存储 IP 地址,类型是 ip:

    PUT blog
    {
      "mappings": {
        "properties": {
          "address":{
            "type": "ip"
          }
        }
      }
    }
    

    添加文档:

    PUT blog/_doc/1
    {
      "address":"192.168.91.1"
    }
    

    搜索文档:

    GET blog/_search
    {
      "query": {
        "term": {
          "address": "192.168.0.0/16"
        }
      }
    }
    

    2.4.2 token_count

    用于统计字符串分词后的词项个数。

    PUT blog
    {
      "mappings": {
        "properties": {
          "title":{
            "type": "text",
            "fields": {
              "length":{
                "type":"token_count",
                "analyzer":"standard"
              }
            }
          }
        }
      }
    }
    

    相当于新增了 title.length 字段用来统计分词后词项的个数。

    添加文档:

    PUT blog/_doc/1
    {
      "title":"zhang san"
    }
    

    可以通过 token_count 去查询:

    GET blog/_search
    {
      "query": {
        "term": {
          "title.length": 2
        }
      }
    }
    

    最后,松哥还搜集了 50+ 个项目需求文档,想做个项目练练手的小伙伴不妨看看哦~



    需求文档地址:https://github.com/lenve/javadoc

    展开全文
  • Elasticsearch(二)——Es 数据存储细节(动态映射、静态映射、类型推断)、核心类型、二十三种映射参数、官方文档地址

    Elasticsearch(二)——Es 数据存储细节(动态映射、静态映射、类型推断)、核心类型、二十三种映射参数、官方文档地址

    一、Es 数据存储细节

    虽然 Es 是 NoSQL ,但是底层也是有数据类型的。

    1、动态映射

    底层会自动的根据存入的数据判断数据类型,这种自动分析就叫动态映射。

    我们可以先创建一个索引,在创建好的索引信息中,可以看到,mappings 为空,这个 mappings 中保存的就是映射信息。

    接着存入下面这么个数据:
    在这里插入图片描述
    然后查看索引信息:
    在这里插入图片描述

    然后查看 mappings,mappings 里面就是定义数据的详细信息:
    在这里插入图片描述

    再往里面细看,可以发现有个 “keywork”,里面还有 type:keyword。text 和 keyword 都是存字符串,但是 keyword 存的是像 邮箱地址和电话号码 这种不需要分词的,是什么就直接是什么,一整个去存。

    所以:
    text:字符串,存储需要分词的。
    keyword:字符串,存储不需要分词的。

    当然,同一个字段可以有多种类型去存。

    动态映射还有一个日期检测的问题。可以看到 publishDate 的数据类型会被推断是日期类型。如果这个时候再存一本书,publishDate 不是日期,而是其他数据类型,那么存储一定会报错;如果是要存字符串类型,我们存数字类型,都一样可以,因为字符串跟数字可以转换,但是日期类型不能转换。

    要解决这个问题,可以使用静态映射,即在索引定义时,将 remark 指定为 text 类型。也可以关闭日期检测:
    在这里插入图片描述
    此时日期类型就回当成文本来处理。

    默认情况下,文档中如果新增了字段,mappings 中也会自动新增进来。

    有的时候,如果希望新增字段时,能够抛出异常来提醒开发者,这个可以通过 mappings 中 dynamic属性来配置。但是这么设置,其实也就是变成静态映射了。

    2、静态映射

    如果希望新增字段时,能够抛出异常来提醒开发者,这个可以通过 mappings 中 dynamic属性来配置。

    dynamic 属性有三种取值:

    • true:默认即此。自动添加新字段。
    • false:忽略新字段。
    • strict:严格模式,发现新字段会抛出异常。

    比如下图(严格模式):
    在这里插入图片描述
    静态映射的意思就是在定义索引时,就把索引中的所有字段类型,统统提前定义枚举好,那么以后往索引中加数据和字段时,就只能按照规定好的加。

    在这里插入图片描述

    如果加了类型不对等的数据,会报 400 错误。

    3、类型推断

    在这里插入图片描述

    二、核心类型

    1、字符串类型

    • string:这是一个已经过期的字符串类型。在 es5 之前,用这个来描述字符串,现在的话,它已经被 text 和 keyword
      替代了。
    • text:如果一个字段是要被全文检索的,比如说博客内容、新闻内容、产品描述,那么可以使用text。用了 text
      之后,字段内容会被分析,在生成倒排索引之前,字符串会被分词器分成一个个词项。text类型的字段不用于排序,很少用于聚合。这种字符串也被称为 analyzed 字段。
    • keyword:这种类型适用于结构化的字段,例如标签、email地址、手机号码等等,这种类型的字段可以用作过滤、排序、聚合等。这种字符串也称之为 not-analyzed 字段。

    2、数字类型

    在这里插入图片描述

    • 在满足需求的情况下,优先使用范围小的字段。字段长度越短,索引和搜索的效率越高。
    • 浮点数,优先考虑使用 scaled_float。

    scaled_float 举例:
    在这里插入图片描述

    3、日期类型

    由于 JSON 中没有日期类型,所以 es 中的日期类型形式就比较多样:

    • 2020-11-11 或者 2020-11-11 11:11:11
    • 一个从 1970.1.1 零点到现在的一个秒数或者毫秒数。

    es 内部将时间转为 UTC,然后将时间按照 millseconds-since-the-epoch 的长整型来存储。

    自定义日期类型:
    在这里插入图片描述
    这个能够解析出来的时间格式比较多。
    在这里插入图片描述
    上面三个文档中的日期都可以被解析,内部存储的是毫秒计时的长整型数。

    4、布尔类型(boolean)

    JSON 中的 “true”、“false”、true、false 都可以。

    5、二进制类型(binary)

    二进制接受的是 base64 编码的字符串,默认不存储,也不可以搜索。

    6、范围类型

    • integer_range
    • float_range
    • long_range
    • double_range
    • date_range
    • ip_range

    定义的时候,指定范围类型即可:

    在这里插入图片描述
    插入文档的时候,需要指定范围的界限:
    在这里插入图片描述
    指定范围的时候,可以使用 gt、gte、lt、lte。

    7、 复合类型

    a、数组类型

    es 中没有专门的数组类型。默认情况下,任何字段都可以有一个或者多个值。需要注意的是,数组中的元素必须是同一种类型。

    添加数组时,数组中的第一个元素决定了整个数组的类型。

    b、对象类型(object)

    由于 JSON 本身具有层级关系,所以文档包含内部对象。内部对象中,还可以再包含内部对象。
    在这里插入图片描述

    c、嵌套类型(nested)

    nested 是 object 中的一个特例。
    如果使用 object 类型,假如有如下一个文档:

    在这里插入图片描述
    由于 Lucene 没有内部对象的概念,所以 es 会将对象层次扁平化,将一个对象转为字段名和值构成的简单列表。即上面的文档,最终存储形式如下:
    在这里插入图片描述

    扁平化之后,用户名之间的关系没了。这样会导致如果搜索 Zhang si 这个人,会搜索到。

    此时可以 nested 类型来解决问题,nested 对象类型可以保持数组中每个对象的独立性。nested 类型将数组中的每一饿对象作为独立隐藏文档来索引,这样每一个嵌套对象都可以独立被索引。

    在这里插入图片描述
    优点:文档存储在一起,读取性能高。

    缺点:更新父或者子文档时需要更新更个文档。比如更新 zhang 这个姓,需要连 san 这个名也一起更新。

    8、地理类型

    使用场景:

    • 查找某一个范围内的地理位置
    • 通过地理位置或者相对中心点的距离来聚合文档
    • 把距离整个到文档的评分中
    • 通过距离对文档进行排序

    a、 geo_point

    在这里插入图片描述
    在这里插入图片描述
    注意:使用数组描述,先经度后纬度。

    地址位置转 geo_hash:http://www.csxgame.top/#/

    b、geo_shape

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    9、特殊类型

    a、IP

    在这里插入图片描述

    b、token_count

    在这里插入图片描述

    三、二十三种映射参数

    1、analyzer

    在这里插入图片描述
    在这里插入图片描述

    这里的结果就不贴图了,可自行尝试。

    默认情况下,中文就是一个字一个字的分,这种分词方式没有任何意义。如果这样分词,查询就只能按照一个字一个字来查,像下面这样:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    结果就不贴图了。

    总之这么分词后,然后就可以通过词去搜索了:
    在这里插入图片描述
    词条向量:存到底层的词是怎么分词的;并不是说简单的存储分词,还有这个词在这句话中具体的位置,以及这个词在这句话中出现了多少次(频率);因为这些将来都要作为搜索评分的标准。

    2、search_analyzer

    查询时候的分词器。默认情况下,如果没有配置 search_analyzer,则查询时,首先查看有没有search_analyzer,有的话,就用 search_analyzer 来进行分词,如果没有,则看有没有 analyzer,如果有,则用 analyzer 来进行分词,否则使用 es 默认的分词器。

    3、normalizer

    normalizer 参数用于解析前(索引或者查询)的标准化配置。

    比如,在 es 中,对于一些我们不想切分的字符串,我们通常会将其设置为 keyword,搜索时候也是使用整个词进行搜索。如果在索引前没有做好数据清洗,导致大小写不一致,例如 javaboy 和JAVABOY,此时,我们就可以使用 normalizer 在索引之前以及查询之前进行文档的标准化。

    先来一个反例,创建一个名为 blog 的索引,设置 author 字段类型为 keyword:

    在这里插入图片描述
    在这里插入图片描述
    大写关键字可以搜到大写的文档,小写关键字可以搜到小写的文档。

    如果使用了 normalizer,可以在索引和查询时,分别对文档进行预处理。

    normalizer 定义方式如下:
    在这里插入图片描述
    在 settings 中定义 normalizer,然后在 mappings 中引用。

    测试方式和前面一致。此时查询的时候,大写关键字也可以查询到小写文档,因为无论是索引还是查询,都会将大写转为小写。

    4、boost

    boost 参数可以设置字段的权重。

    boost 有两种使用思路,一种就是在定义 mappings 的时候使用,在指定字段类型时使用;另一种就是在查询(搜索)时使用。

    实际开发中建议使用后者,前者有问题:如果不重新索引文档,权重无法修改。

    mapping 中使用 boost(不推荐):
    在这里插入图片描述
    另一种方式就是在查询(搜索)的时候,指定 boost(推荐):
    在这里插入图片描述

    5、coerce

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    6、copy_to

    在这里插入图片描述

    7、doc_values 和 fielddata

    es 中的搜索主要是用到倒排索引,doc_values 参数是为了加快排序、聚合操作而生的。当建立倒排索引的时候,会额外增加列式存储映射。

    doc_values 默认是开启的,如果确定某个字段不需要排序或者不需要聚合,那么可以关闭doc_values。

    大部分的字段在索引时都会生成 doc_values,除了 text。text 字段在查询时会生成一个 fielddata 的数据结构,fieldata 在字段首次被聚合、排序的时候生成。

    在这里插入图片描述
    doc_values 默认开启,fielddata 默认关闭。

    在这里插入图片描述
    由于 doc_values 默认时开启的,所以可以直接使用该字段排序,如果想关闭 doc_values ,如下:
    在这里插入图片描述

    8、dynamic

    这个讲动态映射的时候已经说过了,就是严格模式那些。

    9、enabled

    es 默认会索引所有的字段,但是有的字段可能只需要存储,不需要索引。此时可以通过 enabled 字段来控制:
    在这里插入图片描述

    10、format

    日期格式。format 可以规范日期格式,而且一次可以定义多个 format。
    在这里插入图片描述

    • 多个日期格式之间,使用 || 符号连接,注意没有空格。
    • 如果用户没有指定日期的 format,默认的日期格式是 strict_date_optional_time||epoch_mills

    另外,所有的日期格式,可以在 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html网址查看。

    11、ignore_above

    igbore_above 用于指定分词和索引的字符串最大长度,超过最大长度的话,该字段将不会被索引,这个字段只适用于 keyword 类型。
    在这里插入图片描述

    12、ignore_malformed

    ignore_malformed 可以忽略不规则的数据,该参数默认为 false。
    在这里插入图片描述
    在这里插入图片描述

    13、include_in_all

    这个是针对 _all 字段的,但是在 es7 中,该字段已经被废弃了。

    14、index

    index 属性指定一个字段是否被索引,该属性为 true 表示字段被索引,false 表示字段不被索引。

    如果 index 为 false,则不能通过对应的字段搜索。
    在这里插入图片描述

    15、index_options

    index_options 控制索引时哪些信息被存储到倒排索引中(用在 text 字段中),有四种取值:
    在这里插入图片描述

    16、norms

    norms 对字段评分有用,text 默认开启 norms,如果不是特别需要,不要开启 norms。

    17、null_value

    在 es 中,值为 null 的字段不索引也不可以被搜索,null_value 可以让值为 null 的字段显式的可索引、可搜索:
    在这里插入图片描述

    18、position_increment_gap

    被解析的 text 字段会将 term 的位置考虑进去,目的是为了支持近似查询和短语查询,当我们去索引一个含有多个值的 text 字段时,会在各个值之间添加一个假想的空间,将值隔开,这样就可以有效避免一些无意义的短语匹配,间隙大小通过 position_increment_gap 来控制,默认是 100。
    在这里插入图片描述
    sanli 搜索不到,因为两个短语之间有一个假想的空隙,为 100。

    在这里插入图片描述
    可以通过 slop 指定空隙大小。
    也可以在定义索引的时候,指定空隙:
    在这里插入图片描述
    在这里插入图片描述

    近似查询:比如查询 java,但实际输入了 jaav 或者 jvaa 这种,但是近似查询依然能搜索出 java,;近似查询解决的就是这种问题。

    19、properties

    这个就不说了,用了很多次了。

    20、similarity

    similarity 指定文档的评分模型,默认有三种:
    在这里插入图片描述

    21、store

    默认情况下,字段会被索引,也可以搜索,但是不会存储,虽然不会被存储的,但是 _source 中有一个字段的备份。如果想将字段存储下来,可以通过配置 store 来实现。

    22、term_vectors

    term_vectors 是通过分词器产生的信息,包括:

    • 一组 terms
    • 每个 term 的位置
    • term 的首字符/尾字符与原始字符串原点的偏移量

    term_vectors 取值:
    在这里插入图片描述

    23、fields

    fields 参数可以让同一字段有多种不同的索引方式。例如:
    在这里插入图片描述

    24、官方文档

    二十三种映射参数官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-params.html

    展开全文
  • 给出了基于欧洲中尺度数值预报中心(ECMWF)构建的高精度动态映射函数VMF1和GMF的研究进展及方法,对NMF、VMF1和GMF三种映射函数进行了时空分析,结合实例分析了三种映射函数在GNSS遥感水汽中的应用。实验结果证实,...
  • 针对生物特征模板的存储及传输安全问题,结合矢量量化声纹识别算法,提出了基于随机变换和动态映射的可撤销模板设计方法.在注册阶段,采用LBG( Linde-Buzo- Gray)算法对经过随机变换的声纹特征进行训练,获得码本,码本中...
  • ES dynamic mapping(动态映射

    千次阅读 2020-09-30 15:01:02
    —— 遇到陌生字段时, 进行动态映射 false 关闭 —— 忽略遇到的陌生字段 strict 遇到陌生字段时, 作报错处理 二:实例演示 1:约束策略 true PUT my_index { "mappings": { "_doc": { "dynamic": true, //开启 ...

    今天有小伙伴问,Elasticsearch 索引里面的mapping 设置 dynamic = true是什么意思?

    一:ES mapping  dynamic是做什么用的

    • Mapping中的字段类型一旦设定后,禁止直接修改,原因是:Lucene实现的倒排索引生成后不允许修改
    • 只能新建一个索引,然后reindex数据
    • 默认允许新增字段
    • 通过dynamic参数来控制字段的新增:
      • true(默认)允许自动新增字段,但是mapping不显示,查询返回JSON有
      • false 不允许自动新增字段,但是文档可以正常写入,但无法对新增字段进行查询等操作
      • strict 文档不能写入,报错

    约束策略 

    策略功能说明
    true开启 —— 遇到陌生字段时, 进行动态映射
    false关闭 —— 忽略遇到的陌生字段
    strict遇到陌生字段时, 作报错处理

    二:实例演示 

    1:约束策略 true

    PUT my_index
    
    {
      "mappings": {
        "_doc": {
          "dynamic": true,         //开启 —— 遇到陌生字段时, 进行动态映射
          "properties": {
            "user": { 
              "properties": {
                "name": {
                  "type": "text"
                }
              }
            }
          }
        }
      }
    }
    put my_index/_doc/1
    {
      "name": "John Smith",
      "first_name": "John",
      "last_name": "Smith"
    }

     

    2:约束策略 false

    delete my_index
    {}
    
    PUT my_index
    
    {
      "mappings": {
        "_doc": {
          "dynamic": false, 			// 关闭 —— 忽略遇到的陌生字段
          "properties": {
            "user": { 
              "properties": {
                "name": {
                  "type": "text"
                }
              }
            }
          }
        }
      }
    }

    3:约束策略 strict

    delete my_index
    {}
    
    PUT my_index
    
    {
      "mappings": {
        "_doc": {
          "dynamic": "strict",			// 严格控制策略
          "properties": {
            "user": { 
              "properties": {
                "name": {
                  "type": "text"
                }
              }
            }
          }
        }
      }
    }
    put my_index/_doc/1
    {
      "name": "John Smith",
      "first_name": "John",
      "last_name": "Smith"
    }

    小伙伴你清楚了吗?

    以上案例均使用:Elasticsearch 6.5.3 版本演示。

     

    展开全文
  • linux下静态映射与动态映射原理分析

    千次阅读 2018-08-06 21:38:16
    2017年10月1号 (1)外设IO寄存器地址独立编址的CPU,这时该称外设IO寄存器为IO端口,访问IO寄存器可通过io...例如:x86平台普通使用了名为内存映射的技术,IO设备端口被映射到内存空间,映射后,CPU访问IO端口就...
  • 静态映射和动态映射

    千次阅读 2018-02-18 21:46:17
    无论静态映射还是动态映射目的都是将外设地址映射到虚拟地址的空间(3G-4G)中分配给用作外设映射的虚拟地址空间(开启mmu后cpu看到的都是虚拟地址,访问外设时同样需要映射到虚拟地址空间) 一般写寄存器读寄存器...
  • 安全技术-网络信息-未来虚拟网络动态映射算法研究.pdf
  • Elasticsearch动态映射与日期类型

    千次阅读 2020-04-05 11:29:55
    Elasticsearch动态映射与日期类型 JSon没有日期类型,但Elasticsearch能自动为我们映射日期字段。如果结合日期字段命名约定可以帮我我们准确实现动态映射。 1. 动态映射 Elasticsearch的动态映射特性可以实现根据...
  • 动态映射

    千次阅读 2016-09-14 00:33:57
    动态映射(Dynamic Mapping) 当ES在文档中碰到一个以前没见过的字段时,它会利用动态映射来决定该字段的类型,并自动地对该字段添加映射。 有时这正是需要的行为,但有时不是。你或许不知道在以后你的文档...
  • 网络游戏-可扩展网络化装置动态映射.zip
  • 动态映射函数对GPS基线解算质量的影响.pdf
  • 学习笔记:NET 网络地址转换 (Network Address Translation),PAT动态映射,静态地址映射 一、引入NAT: 1)ipv4地址严重不够用! 2)开发了私有IP:10开头的 172.16-172.31开头的 192.168.开头 3)要求私有...
  • 要为文档建立索引,您不必首先创建索引、定义映射类型和定义字段——您只需为文档建立索引,索引、类型和字段就会自动启动,例如: PUT data/_doc/1 { "count": 5 }    执行上述请求时,索引"...
  • 基于动态映射的卷积神经网络量化重训练方法.pdf
  • 基于NoC的故障感知低功耗动态映射算法
  • 作为EtherCAT协议栈的补充,实现PDO动态映射,是一个完整的EtherCAT从站必要的组成部分。
  • 测试感知动态映射,以路径为中心的片上网络测试
  • 虚拟地址映射分为动态映射和静态映射 静态映射的特点 在内核启动时建立静态映射表,在内核关机时销毁,中间一直有效,优点是执行效率高,缺点是始终占用虚拟地址空间,空间利用率低 不同版本内核静态映射表位置,...
  • 76 ElasticSearch 使用动态映射模板定制自己的映射策略分布式实战(干货)spring cloud 实战(干货)mybatis 实战(干货)spring boot 实战(干货)React 入门实战(干货)构建中小型互联网企业架构(干货)python ...
  • //重新映射字段关系. dbmodel . Entity < WReport > ( ) . ToTable ( "w_report_history" ) ; //切换表映射. var dbmodelcompile = dbmodel . Build ( dbConn ) . Compile ( ) ; var newContext = ...
  • 动态字段映射 我们知道,我们在ES向ES中写入数据的时候会自动检测数据的类型,会为这些数据创建类型,那么es是如何自动检测字段类型的? es会参照默认的字段映射类型表,如下: json 类型 es数据类型 ...
  • ES动态映射成keyword不能全文检索

    千次阅读 2019-07-26 11:34:03
    当ES在文档中碰到一个以前没见过的字段时,它会利用动态映射来决定该字段的类型,并自动地对该字段添加映射。 ES动态映射,创建了字段,而且默认添加一个keyword的field,导致不能全文索引 "custom_info": { ...
  • hibernate动态映射表处理oralce10g的clob类型,压缩包为整个工程包. 真诚地希望能帮到你,同时真诚地希望你能和我交流, about any question^_^

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 510,877
精华内容 204,350
关键字:

动态映射