精华内容
下载资源
问答
  • 产品mapping
    千次阅读
    2022-03-25 10:09:08

    mapping

    类似于数据库的schema的定义,mapping会把文档映射成lucene需要的扁平格式,一个mapping属于一个索引的type,一个type中有一个mapping定义,7.0后一个索引只有一个type,所以不需要在mapping中定义type的信息。作用如下:

    定义索引这里面的字段和名称
    定义字段的数据类型,字符串、布尔、数字…
    字段,倒排索引相关的配置,是否分词。

    mapping的基本格式

    {
        "mappings":{
            "_doc":{
                "_all":{
                    "enabled":false  #默认情况,ElasticSarch自动使用_all所有的文档的域都会被加到_all中进行索引。可以使用"_all" : {"enabled":false} 开关禁用它。如果某个域不希望被加到_all中,可以使用"include_in_all":false关闭
                },
                "properties":{
                    "uuid":{
                        "type":"text",
                        "copy_to":"_search_all", #对应_search_all字段,可以对其进行全文检索
                        "fields":{
                            "keyword":{
                                "type":"keyword",  
                                "ignore_above":150  #ignore_above 默认值是256,当字段文本的长度大于指定值时,不做倒排索引。
                            }
                        }
                    },
                    "name":{
                        "type":"text",
                        "copy_to":"_search_all",
                        "analyzer":"ik_max_word",  # ik_max_word 插件会最细粒度分词
                        "search_analyzer":"ik_smart",  # ik_smart 粗粒度分词
                        "fields":{
                            "keyword":{
                                "type":"keyword",
                                "ignore_above":150
                            }
                        }
                    },
                    "dt_from_explode_time":{
                        "type":"date",
                        "copy_to":"_search_all",
                        "format":"strict_date_optional_time||epoch_millis"
                    },
                    "_search_all":{
                        "type":"text"
                    }
                },
                "date_detection":false,  #关闭日期自动检测,如果开启,会对于设置为日期格式的字段进行判断
                "dynamic_templates":[   #用于自定义在动态添加field的时候自动给field设置的数据类型
                    {
                        "strings":{
                            "match_mapping_type":"string",
                            "mapping":{
                                "type":"text",
                                "copy_to":"_search_all",
                                "fields":{
                                    "keyword":{
                                        "type":"keyword",
                                        "ignore_above":150
                                    }
                                }
                            }
                        }
                    }
                ]
            }
        },
        "settings":{
            "index":{
                "number_of_shards":6, #分片数量
                "number_of_replicas":1  #副本数量
            }
        }
    }
    
    

    分词:

    按照一般情况来讲,索引分词应该按照最细粒度来分词,搜索分词可按最粗粒度来分词
    比如搜索“华为手机”
    用户不希望将关键词拆分为华为,手机,那这样各类手机和华为路由器或华为其它产品也能搜索出来
    所以这块建议搜索分词设置为最粗粒度

    mapping的参数说明

    字段类型概述

    一级分类二级分类具体类型
    核心类型字符串类型string,text,keyword
    整数类型integer,long,short,byte
    浮点类型double,float,half_float,scaled_float
    逻辑类型boolean
    日期类型date
    范围类型range
    二进制类型binary
    复合类型数组类型array
    对象类型object
    嵌套类型nested
    地理类型地理坐标类型geo_point
    地理地图geo_shape
    特殊类型IP类型ip
    范围类型completion
    令牌计数类型token_count
    附件类型attachment
    抽取类型percolator

    string类型:ELasticsearch 5.X之后的字段类型不再支持string,由text或keyword取代。 如果仍使用string,会给出警告
    text取代了string,当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合(termsAggregation除外)
    keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到

    Dynamic Mapping

    写入文档的时候,索引不存在,会自动创建索引, 无需手动创建,ES会根据内容推断字段的类型,推断会不准确,可能造成某些功能无法使用,例如 范围查询。

    查看一个索引当前的mapping

    GET /movies/_mapping

    修改Mapping的字段类型

    在写入文档的时候,有可能当前文档的索引并不存在,就会为我们自动创建索引
    DynamicMapping使得我们无需手动定义Mapping字段信息,ES根据文档的信息来推断出文档的类型。
    ES推算的字段类型并不完全准确。
    当类型设置的不对时,有些功能无法正常运行,比如聚合、分词、范围查询等等。

    新增字段
    dynamic设置为true,一旦有新增字段的文档写入,mapping也同时被更新。
    dynamic设置为false,mapping不会被更新,新增的字段数据无法被索引,但是信息会出现在source中.
    dynamic设置为strict,文档写入失败
    已有的字段,一旦有数据写入,不支持修改(倒排索引不支持修改)
    希望更改字段类型,用Reindex API,重建索引
    设计原因
    如果修改字段数据类型,会导致已经被索引的文档不能被搜索。
    新增字段不存在影响。

    SpringDataElasticsearch操作Elasticsearch创建索引库以及创建映射

    注意:SpringDataElasticsearch底层使用的不是Elasticsearch提供的RestHighLevelClient,而是TransportClient,并不采用Http协议通信,而是访问elasticsearch对外开放的tcp端口

    spring:
      data:
        elasticsearch:
          cluster-name: myescluster
          cluster-nodes: ip1:9300, ip2:9300, ip3:9300
          index-name: test
    
    

    JavaConfig定义

    @Component
    @Data
    public class AppConfig {
    
        @Value("${spring.data.elasticsearch.index-name}")
        private String indexName;
    }
    
    

    pojo

    /**
     * MyObject实体
     *
    
     */
    @Data
    @Document(indexName = "#{appConfig.indexName}", type = "myObject")
    public class MyObject {
    
        @Id
        @Field(index = false, store = true, type = FieldType.Keyword)
        private String tid;
    
        @Field(index = true, store = true, analyzer = "ik", searchAnalyzer = "ik", type = FieldType.Text)
        private String title;
    
        @Field(index = true, store = true, analyzer = "ik", searchAnalyzer = "ik", type = FieldType.Text)
        private String content;
    
        @Field(index = false, store = true, type = FieldType.Date, format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss")
        private Date time;
    
    }
    
    
    
    
    

    @Document:声明索引库配置
    indexName:索引库名称
    type:类型名称,默认是“docs”
    shards:分片数量,默认5
    replicas:副本数量,默认1
    @Id:声明实体类的id
    @Field:声明字段属性
    type:字段的数据类型
    analyzer:指定分词器类型
    index:是否创建索引

    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringElasticsearchTest {
    
        @Autowired
        private ElasticsearchTemplate elasticsearchTemplate;
    
    
        /**
         * 创建索引和映射
         */
        @Test
        public void testCreateMappingAndIndex(){
            try {
                elasticsearchTemplate.putMapping(MyObject .class);
            } catch (Exception e) {
                elasticsearchTemplate.createIndex(MyObject .class);
                elasticsearchTemplate.putMapping(MyObject .class);
            }
        }
    
        /**
         * 创建索引库
         */
        @Test
        public void testCreateIndex(){
            // 创建索引库,并制定实体类的字节码
            elasticsearchTemplate.createIndex(MyObject .class);
        }
    
        /**
         * 创建映射
         */
        @Test
        public void testCreateMapping(){
            // 创建索引库,并制定实体类的字节码
            elasticsearchTemplate.putMapping(MyObject .class);
        }
    }
    
    
    
    更多相关内容
  • 制造商提供的产品列表将由团队进行分类,鉴于给定列表中可能有超过100,000个订单项,因此这是一项非常繁琐的任务。 我建议创建一个程序来帮助解决这个问题。 它包含两个部分-用于创建模板映射的Java和用于实际分配...
  • 项目说明 Easydb,是一款简洁易用的O/R Mapping产品,是应用于JAVA/J2EE项目中的持久层框架,使得开发人员可以更加高效地构建应用系统,着重关注业务逻辑而非数据存储,节省项目的开发、维护成本。 Easydb,其思路...
  • User Story Mapping

    2019-02-13 10:52:56
    用户故事方式来介绍产品规划,英文版,一边学英文,一边学产品
  • Mapping_Earthquakes

    2021-04-05 07:56:46
    最终产品是一个显示地震信息的网站。 ![map_1.png](https:// ) 资源 实用工具:VSCode,Javascript,CSS,HTML,GeoJSON数据 ![map_2.png](https:// ) 结果 该网站的主要功能包括在不同版本的地图之间...
  • tcpmapping-端口转发.rar

    2019-06-24 16:28:46
    网络测试服务工具,很好用的一款产品
  • Mapping

    千次阅读 2019-08-27 11:14:05
    mapping是定义文档及其字段是如何存储和索引的程序。例如,使用mapping定义: 哪个字符串字段应该视为全文字段 哪个字段包含数字,日期,或地理位置 日期的格式 自定义规则来控制动态添加字段 mapping type 每个...

    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": {
          "properties": {
            "date": {
              "type": "date" // 不指定format,那就使用上面提到的默认值
            }
          }
        }
      }
      
      PUT my_index/_doc/1
      { "date": "2015-01-01" }   // 纯日期
      
      PUT my_index/_doc/2
      { "date": "2015-01-01T12:10:30Z" } //日期+时间
      
      PUT my_index/_doc/3
      { "date": 1420070400001 }  // 毫秒数
      
      GET my_index/_search
      {
        "sort": { "date": "asc"} 
      }
      

      自定义多种日期格式:

      PUT my_index
      {
        "mappings": {
          "properties": {
            "date": {
              "type":   "date",
              "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            }
          }
        }
      }
      
    • 布尔

      • boolean: true, false
    • 二进制

      • binary

        PUT my_index
        {
          "mappings": {
            "properties": {
              "name": {
                "type": "text"
              },
              "blob": {
                "type": "binary"
              }
            }
          }
        }
        
        PUT my_index/_doc/1
        {
          "name": "Some binary blob",
          "blob": "U29tZSBiaW5hcnkgYmxvYg=="   // base64编码后的二进制
        }
        
    • 范围

      • integer_range: -2^31 ~ 2^31-1
      • float_range
      • long_range
      • double_range
      • date_range

      示例:范围字段在索引文档时,需要使用gte, lte

      PUT range_index
      {
        "settings": {
          "number_of_shards": 2
        },
        "mappings": {
          "properties": {
            "expected_attendees": {
              "type": "integer_range"
            },
            "time_frame": {
              "type": "date_range", 
              "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            }
          }
        }
      }
      
      PUT range_index/_doc/1?refresh
      {
        "expected_attendees" : {   // 索引文档时需要指定范围
          "gte" : 10,
          "lte" : 20
        },
        "time_frame" : { 
          "gte" : "2015-10-31 12:00:00", 
          "lte" : "2015-11-01"
        }
      }
      

    复杂数据类型

    • object 对象

      JSON文档本身就是一种结构话的数据,比如:

      PUT my_index/_doc/1
      { 
        "region": "US",
        "manager": { // manager对象
          "age":     30,
          "name": { 
            "first": "John",
            "last":  "Smith"
          }
        }
      }
      

      ES内部会将以上文档索引为扁平的键值对,类似于:

      {
        "region":             "US",
        "manager.age":        30,
        "manager.name.first": "John",
        "manager.name.last":  "Smith"
      }
      

      以上文档的mapping如下:

      PUT my_index
      {
        "mappings": {
          "properties": { 
            "region": {
              "type": "keyword"
            },
            "manager": { // manager作为内部对象,可以有自己的age, name
              "properties": {
                "age":  { "type": "integer" },
                "name": { 
                  "properties": {
                    "first": { "type": "text" },
                    "last":  { "type": "text" }
                  }
                }
              }
            }
          }
        }
      }
      

      object字段支持参数如下:

      • dynamic 是否支持对象的properties动态增加字段,默认"true"
      • enabled 是否允许对象字段直接解析索引JSON,默认"true"
    • nested 嵌套对象,用来支持多个对象构成的数组,mapping如下:

      PUT my_index
      {
        "mappings": {
          "properties": {
            "user": {
              "type": "nested" 
            }
          }
        }
      }
      

      索引文档:

      PUT my_index/_doc/1
      {
        "group" : "fans",
        "user" : [
          {
            "first" : "John",
            "last" :  "Smith"
          },
          {
            "first" : "Alice",
            "last" :  "White"
          }
        ]
      }
      

      查询示例1:

      GET my_index/_search
      {
        "query": {
          "nested": {
            "path": "user",
            "query": {
              "bool": {
                "must": [
                  { "match": { "user.first": "Alice" }},
                  { "match": { "user.last":  "Smith" }} 
                ]
              }
            }
          }
        }
      }
      

      以上查询无法匹配任何结果,因为"Alice"和"Smith"不在同一个嵌套对象中。

      查询示例2:

      GET my_index/_search
      {
        "query": {
          "nested": {
            "path": "user",
            "query": {
              "bool": {
                "must": [
                  { "match": { "user.first": "Alice" }},
                  { "match": { "user.last":  "White" }} 
                ]
              }
            },
            "inner_hits": { // 匹配的嵌套文档进行高亮
              "highlight": {
                "fields": {
                  "user.first": {}
                }
              }
            }
          }
        }
      }
      

      由于"Alice"和"White"在同一个嵌套对象中,因此可以查询可以匹配。

    地理信息数据类型

    • geo_point
    • geo_shape

    专门数据类型

    • ip

    • completion 自动完成(搜索建议)

    • token_count:字符串中的词条的数量

    • murmur3 索引时计算内容的哈希值并存储在索引中

    • annotated-text 索引包含特殊标记的文本(用于标识命名实体)

    • join 定义索引中文档的父子关系

      PUT my_index
      {
        "mappings": {
          "properties": {
            "my_join_field": { 
              "type": "join",
              "relations": {
                "question": "answer"  // question和answer是父子关系
              }
            }
          }
        }
      }
      
    • alias 已存在字段定义别名

    • rank 记录数字特征来提高查询的命中

    • vector 向量

    数组

    ES中,数组不需要专门的字段。默认情况下,任何字段都可以包括零个或多个值,但是所有的值必须具有相同的数据类型。

    动态mapping

    字段和mapping类型不需要事先定义,因此在索引文档时,新字段的名字将会自动添加(可以添加到根字段,或者是object和nested子字段)

    详尽mapping

    比起Elasticsearch的“猜测”,你更清楚你的数据。所以一开始可以用动态mapping,到某个阶段后,你可以自己定制mapping。

    你可以在创建索引(集)时创建字段mapping,然后通过PUT mapping API来向已经存在的索引(集)增加字段。

    更新现存字段的mapping

    除了文档之外,现存字段的mapping无法更新。更新字段意味着已经索引的文档会失效。相反,你应该用正确的mapping创建一个新的索引,然后reindex数据到新的索引中。如果你只是想重命名某个字段而不改变mapping,可以使用alias字段。

    示例

    创建索引时指定mapping:

    PUT my_index 
    {
      "mappings": {
        "properties": {
          "title":    { "type": "text"  }, 
          "name":     { "type": "text"  }, 
          "age":      { "type": "integer" },  
          "created":  {
            "type":   "date", 
            "format": "strict_date_optional_time||epoch_millis"
          }
        }
      }
    }
    

    废除mapping types

    7.0之后废除,原先需要指定type的地方,都用_doc代替。

    由于第一版ES中,所有的文档存储在单个索引中,比如user类型的文档和blog类型的文档,他们的数据结构不同,为了区分,就分别定义了user类型,和blog类型。每个文档都有一个_type元字段来标明类型,搜索时也需要指定类型名。另外,在单个索引中,不同的类型的文档可以拥有相同的_id值,因此要唯一标识一个资源,需要通过_type_id

    更多信息查看具体查看官网

    mapping参数

    • normalizer 相当于keyword字段的analyzer,只不过保证语义分析链最终返回一个词条

    • analyzer 略

    • boost 字段权重,默认1.0

    • copy_to 将多个字段的值放到一个字段

      PUT my_index
      {
        "mappings": {
          "properties": {
            "first_name": {
              "type": "text",
              "copy_to": "full_name" 
            },
            "last_name": {
              "type": "text",
              "copy_to": "full_name" 
            },
            "full_name": {
              "type": "text"
            }
          }
        }
      }
      
    • fields 对同一字段指定不同的数据类型和分词器

      PUT my_index
      {
        "mappings": {
          "properties": {
            "city": {
              "type": "text",
              "fields": {
                "raw": { 
                  "type":  "keyword"
                }
              }
            }
          }
        }
      }
      

      city用于全文检索,city.raw作为keyword,可以支持排序聚合

    • completion

    • 其他略,参考text数据类型的参数

    展开全文
  • User Experience Mapping

    2017-07-30 15:06:21
    Get closer to your users and create better products for them。了解你的用户并为他们打造更好的产品
  • es mapping 的概念

    2021-11-17 11:34:23
    Mapping 1 概念: ​ ES中的mapping有点类似与RDB中“表结构”的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否...

    Mapping

    1 概念:

    ​ ES中的mapping有点类似与RDB中“表结构”的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有对个类型。分词器、评分等概念在后面的课程讲解。

    2 查看mapping

    ​ GET /index/_mappings

    3 ES数据类型

    常见类型

    1) 数字类型

    ​ long integer short byte double float half_float scaled_float unsigned_long

    2) Keywords

    keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword

    ​ constant_keyword:始终包含相同值的关键字字段

    ​ wildcard:可针对类似grep的通配符查询优化日志行和类似的关键字值

    ​ 关键字字段通常用于排序汇总Term查询,例如term

    3) Dates(时间类型):包括datedate_nanos

    ​ 4) alias:为现有字段定义别名。

    ​ 5) binary(二进制):binary

    ​ 6) range(区间类型):integer_range、float_range、long_range、double_range、date_range

    ​ 7) text:当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索 引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。(解释一下为啥不会为text创建正排索引:大量堆空间,尤其是 在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问 题。这就是默认情况下禁用字段数据的原因)

    ② 对象关系类型:

    1) object:用于单个JSON对象

    2) nested:用于JSON对象数组

    ​ 3) flattened:允许将整个JSON对象索引为单个字段。

    ③ 结构化类型:

    1) geo-point:纬度/经度积分

    2) geo-shape:用于多边形等复杂形状

    3) point:笛卡尔坐标点

    2) shape:笛卡尔任意几何图形

    ​ ④ 特殊类型:

    1) IP地址:ip 用于IPv4和IPv6地址

    2) completion:提供自动完成建议

    ​ 3) tocken_count:计算字符串中令牌的数量

    ​ 4) murmur3:在索引时计算值的哈希并将其存储在索引中

    ​ 5) annotated-text:索引包含特殊标记的文本(通常用于标识命名实体)

    ​ 6) percolator:接受来自query-dsl的查询

    ​ 7) join:为同一索引内的文档定义父/子关系

    ​ 8) rank features:记录数字功能以提高查询时的点击率。

    ​ 9) dense vector:记录浮点值的密集向量。

    ​ 10) sparse vector:记录浮点值的稀疏向量。

    ​ 11) search-as-you-type:针对查询优化的文本字段,以实现按需输入的完成

    ​ 12) histogram:histogram 用于百分位数聚合的预聚合数值。

    ​ 13) constant keyword:keyword当所有文档都具有相同值时的情况的 专业化。

    ​ ⑤ array(数组):在Elasticsearch中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有 相同的数据类型。

    ​ ⑥新增:

    ​ 1) date_nanos:date plus 纳秒

    ​ 2) features:

    4 两种映射类型

    • Dynamic field mapping:

      • 整数 => long

      • 浮点数 => float

      • true || false => boolean

      • 日期 => date

      • 数组 => 取决于数组中的第一个有效值

      • 对象 => object

      • 字符串 => 如果不是数字和日期类型,那会被映射为text和keyword两个类型

        除了上述字段类型之外,其他类型都必须显示映射,也就是必须手工指定,因为其他类型ES无法自动识别。

    • Expllcit field mapping:手动映射

      PUT /product
      {
      	"mappings": {
          "properties": {
          	"field": {
            	"mapping_parameter": "parameter_value"
      	   	}
         	}
       	}
      }
      

    5 映射参数

    index:是否对创建对当前字段创建倒排索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示

    ​ ② analyzer:指定分析器(character filter、tokenizer、Token filters)。

    ​ ③ boost:对当前字段相关度的评分权重,默认1

    ​ ④ coerce:是否允许强制类型转换 true “1”=> 1 false “1”=< 1

    ​ ⑤ copy_to:该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询

    doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘 空间(不支持text和annotated_text)

    ​ ⑦ dynamic:控制是否可以动态添加新字段

    ​ 1) true 新检测到的字段将添加到映射中。(默认)

    ​ 2) false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式 添加新字段。

    ​ 3) strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显式添加到映射中

    eager_global_ordinals:用于聚合的字段上,优化聚合性能。

    ​ 1) Frozen indices(冻结索引):有些索引使用率很高,会被保存在内存中,有些使用率特别低,宁愿在使用的时候重新创建,在使用完毕后丢弃数据, Frozen indices的数据命中频率小,不适用于高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices是只读的,请求可能 是秒级或者分钟级。****eager_global_ordinals不适用于Frozen indices****

    ​ ⑨ enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,让然可以检索并在_source元数据中展示,谨慎使用,该状态无法 修改。

        PUT my_index
        {
          "mappings": {
            "enabled": false
          }
        }
    

    fielddata:查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中

    fields:给field创建多字段,用于不同目的(全文检索或者聚合分析排序)

    ​ ⑫ format:格式化

      "date": {
         "type":  "date",
         "format": "yyyy-MM-dd"
       }
    

    ​ ⑬ ignore_above:超过长度将被忽略

    ​ ⑭ ignore_malformed:忽略类型错误

    ​ ⑮ index_options:控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text字段

    ​ ⑯ Index_phrases:提升exact_value查询速度,但是要消耗更多磁盘空间

    ​ ⑰ Index_prefixes:前缀搜索

    ​ 1) min_chars:前缀最小长度,>0,默认2(包含)

    ​ 2) max_chars:前缀最大长度,<20,默认5(包含)

    ​ ⑱ meta:附加元数据

    ​ ⑲ normalizer:

    ⑳ norms:是否禁用评分(在filter和聚合字段上应该禁用)。

    21 null_value:为null值设置默认值

    ​ 22 position_increment_gap:

    ​ 23 proterties:除了mapping还可用于object的属性设置

    24 search_analyzer:设置单独的查询时分析器:

    ​ 25 similarity:为字段设置相关度算法,支持BM25、claassic(TF-IDF)、boolean

    26 store:设置字段是否仅查询

    ​ **27 term_vector:**运维参数

    展开全文
  • 这篇文章是我的一个好友彭文华彭总写的, ID Mapping是阿里巴巴数据中台的核心能力之一。欢迎大家添加彭总微信:shirenpengwh ,一起探讨大数据相关技术。网上 ID Map...

    这篇文章是我的一个好友彭文华彭总写的, ID Mapping是阿里巴巴数据中台的核心能力之一。欢迎大家添加彭总微信:shirenpengwh ,一起探讨大数据相关技术。

    网上  ID Mapping  的技术文章不多,我正好经历过传统数据清洗和互联网  ID Mapping  两种场景,今天就把具体方法总结分享一下。

    为啥要做ID Mapping?

    其实技术都是为了解决实际业务问题的。如果没有数据孤岛的问题,也就不会有这波澜壮阔的数字技术发展和改革。

    在 10 多年前的时候,当时IT界都还在做“四库十二金”的项目。我就接了这么一个活,就是把一个地区的所有地址给弄干净。这可就费劲了,因为同一个地址有 N 多种写法,比如说“大裤衩”,全称叫“中央电视台总部大楼”,门牌号是“北京市朝阳区东三环中路32号”,也有别称叫“中央电视台新址”,而且还有具体经纬度。

    这么乱的情况,一不小心就给弄错了。我们当时接的项目就是把这乱七八糟的地址给统一了,给地理信息库提供基础数据。这上那弄去啊?太费劲了好么!

    我们当时是怎么弄的呢?说来也很简单,就是比对。写规则比对,简单规则对不上,就用复杂规则对,复杂规则还对不上,就肉眼雷达看。先对大厦、门牌号啥的做清洗,把错别字等都清洗好。然后以相对比较精准的数据源为准,匹配一波,相同的先打上标记。然后把类似的也放一边,最后把都匹配不上的放一边,最后把经纬度也加上一起看。最后再人工肉眼雷达过两遍,最后剩下的就不管了。

    这太痛苦了!不过我那时候技术不行,不知道用高技术。百度这边就用图数据库解决这个问题,现在在百度上搜索啥都给你弄出来:

    28e5c37f3ea0c1607e59ee07c42809b1.png

    在互联网场景中,这种例子到处都是。数据中台盛行之前,在 DSP (互联网广告投放平台)中就有 ID Mapping 的应用场景。他们必须要识别在不同端(家里电脑、公司电脑)登录的同一个用户。

    他们拿不到很多详细的数据,只能靠浏览器的 Cookie 数据来识别,所以 DSP 系统中的 ID Mapping 是基于 cookie 来做的,同一个客户,在不同端登录的时候,相同的 cookie 在 DMP (数据管理平台)识别成为同一个客户。

    但是这里还有一个问题,就是 cookie 只能隶属于同一个域名,也就是说你访问邮箱的 cookie ,与百度广告联盟的 cookie 并不是同一个,所以在网站和DSP之间,也要做 ID Mapping 。

    他们通过这么 Mapping 之后,就能知道你在那些网站上登录,都看了些啥东西,然后再给你推荐相关的内容。

    这就有了你在百度上搜索了“养生”,到购物网站上就会给你推荐“枸杞”一样。

    而现在,由于我们的系统越来越复杂,对客户的价值发现要求越来越高,我们在普通的场景中也有类似的需求。

    比如我们的交易平台上的用户交易信息和 ERP 中有可能只是通过订单关联,两遍的系统中的用户根本就是两码事,另外,我们 CRM 中的客户信息又是独立的。交易平台、 ERP 、 CRM 中的用户根本都是相互独立的,我们没法掌握与客户接触的全貌,也就没法精准的识别客户的价值。

    而阿里当时遇到的情况比我们更复杂,它不仅是各个系统之间的数据孤岛现象严重,更糟糕的是各个业务线各自一套。

    这可就要了命了。所以当时阿里就利用 DSP 中的 ID Mapping 逻辑,对所有数据进行了彻底的贯通。这就是阿里数据中台的 One ID 基础。

    ID Mapping的核心技术

    ID Mapping 有几个场景:1、多端数据的识别;2、多源数据的打通。这两种情况的处理方式基本是一样的。

    先举一个例子:老王在商城PC端浏览商品,在手机端下单,后台自动生成订单,交给ERP进行后续的订单、物流处理。后来老王有点不耐烦,给供应链金融客服打电话咨询。那么老王的数据如下:

    e4bc79a674a87a32f6d95499d5223025.png

    (注:大多数情况下网页端和手机端的 UUID 是一样的,这只是一个例子,理解大意就行)

    这种情况,我们用写 SQL 的方式不是那么好使,因为关联情况太多了。而且这是一个个例,你要让所有数据都直接打通,这可不好弄啊。

    你非要写 SQL 也能行,但是这规则可就复杂的多了,而且对系统的要求也非常高。而且,你还得考虑在某端偶尔登录一次的情况。这就更蒙圈了好么?在落地的时候你会遇到一堆的问题。

    现在大数据环境了,技术也发展的很快,当然不能用我之前做数据清洗的方式那么弄,写 SQL 就显得太傻了。之前我就介绍过,百度用的是图数据库的方式解决的。

    图计算的逻辑就是把数据抽象成“点”和“边”,然后用图计算天然的“连接”特效,实现数据的自动识别和打通。

    你看,其实我们要做的,就是把这几个数据做一个打通,类似于这样:

    ee5f2bf9b0ec68f3d5b5cfbdc686faa3.png

    你看这个图,既没有方向,也可能不能形成“环”状。这就是一个无向连通图。这么着一连,这些信息就能对上了。

    你现在想写,写 SQL 是不是非常难?但是用图计算就非常简单了。把数据处理成图数据库需要的格式,然后用图计算就很容易得到我们要的结果。

    而且,我们还能对“边”设定阈值,把用户在打印室等临时登录场景给去掉,过滤噪音,是不是非常好用?

    所以呢, ID Mapping 的过程基本是以下几步:

    1、各源/端的要素识别,就是能够识别用户信息的各个要素,原始 ID 也是有用的;

    2、各自抽象和组装成“点”和“边”的数据集,设置边阈值,过滤弱连接;

    3、构建一个图模型,用连通子图算法求得那些ID标识属于同一个对象;

    4、得到结果集,分配一个新的 ID ;

    5、去重、合并数据,生成最终结果;

    6、循环 3-5 环节,同时在3环节使用已有结果集,已有 id 则沿用老 ID 。

    最后,就生成一张 id 映射字典,大概的意思就是:

    a85d5987425365d58fb76b633df52859.png

    就这样,孤立的系统数据就算是从 ID 层面打通了,我们基于这个字典我们就能做更多事情了,比如更全面的画一个用户画像。

    数据我们也能存好,怎么放都行,最好是扔ES等查询速度快的数据库里,对外提供 One ID 的查询服务。

    以上就是ID-Mapping的核心技术了。在实际落地的时候,你还会遇到各种各样的问题,比如遇到多对多的情况怎么办?之前缺少要素匹配不上,但是后来用户增加了信息,又匹配上了咋办?

    结果数据存成什么样比较好用?放在那里比较好?要不要建一个DV模型方便找数据?那是工程建设中需要考虑的问题。这就得完全靠实践出真知了。

    总结

    One ID的核心价值是打通数据孤岛,把不同时期孤立建设的系统,用统一的ID串联起来。One ID功能就像是在修桥梁,把各个数据孤岛贯通之后,这些孤岛就连成一片。

    数据孤岛被打破之后,我们就能更全面、更完整的了解我们的用户、产品、商家,能够更加精准的评价他们的价值,进行进一步的价值发现,为精细化运营夯实数据基础。

    One ID的核心技术是ID-Mapping,其原理是将各系统的关键要素抽象成图计算用的“点”和“边”,用图计算算法很轻易的判定同一个“对象”,从而构建一个个无向连通图,生成ID映射字典。

    这个ID映射字典就是一座座通往各个数据孤岛的桥梁。我们通过这些桥梁,可以把相同“对象”在不同孤岛中的数据串联起来。这样,我们就掌控了全局,而非局部。

    首先需要建立数据仓库,用于存储用户标签数据。Hive是基于Hadoop的数据仓库工具,依赖于HDFS存储数据,提供的SQL语言可以查询存储在HDFS中的数据。开发时一般使用Hive作为数据仓库,存储标签和用户特征库等相。

    27997c3821b079c39038d3d3d4c6cead.png

    9b57377505408101008cdfe25c415e25.png

    八千里路云和月 | 从零到大数据专家学习路径指南

    我们在学习Flink的时候,到底在学习什么?

    193篇文章暴揍Flink,这个合集你需要关注一下

    Flink生产环境TOP难题与优化,阿里巴巴藏经阁YYDS

    Flink CDC我吃定了耶稣也留不住他!| Flink CDC线上问题小盘点

    我们在学习Spark的时候,到底在学习什么?

    在所有Spark模块中,我愿称SparkSQL为最强!

    硬刚Hive | 4万字基础调优面试小总结

    数据治理方法论和实践小百科全书

    标签体系下的用户画像建设小指南

    4万字长文 | ClickHouse基础&实践&调优全视角解析

    【面试&个人成长】2021年过半,社招和校招的经验之谈

    大数据方向另一个十年开启 |《硬刚系列》第一版完结

    我写过的关于成长/面试/职场进阶的文章

    当我们在学习Hive的时候在学习什么?「硬刚Hive续集」

    展开全文
  • ES中的mapping有点类似与RDB中“表结构”的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等...
  • Mapping映射

    千次阅读 2018-12-06 14:40:34
    text取代了string,当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于...
  • 用户画像之ID-Mapping

    千次阅读 2021-12-31 11:14:53
    各个部门、业务、产品,各自定义和存储其数据,使得这些数据间难以关联,变成孤岛一般的存在。 OneID的做法是通过统一的实体识别和连接,打破数据孤岛,实现数据通融。各个部门、业务、产品对业务实体的UID(唯一性ID...
  • Mapping | Elasticsearch Guide [7.15] | Elastic 可能刚接触es的小白和我一样(我也是小白),映射是个啥玩意,如果直接学习的java朋友感觉可能听起来不太没有那么的通俗易懂,如果有c的基础的话,c里面就有一个...
  • 在这种激烈的人才争夺战中,越来越多的大公司开始通过人才Mapping来助力招聘。 清晰准确的人才Mapping,可以帮助招聘团队了解行业情况和人才分布动态,更好地把握人才市场,制定关键的招聘策略,是人才争夺战中获胜...
  • 本文将以神策数据基于 ID-Mapping 全面升级数字化经营能力的三个真实场景为例,讲述神策数据如何通过 ID-Mapping 解决大规模存量数据的用户 ID 拉通问题,激活全域营销,打通数字化经营的任督二脉。 图 神策 ID-...
  • 数仓建模—ID Mapping(上)

    万次阅读 2021-07-21 10:10:27
    ID Mapping ID Mapping 就如同它的名字一样,我们要做的就是将一系列的ID 关联起来,从而可以更加准确完善的分析一个用户。 选取合适的用户标识对于提高用户行为分析的准确性有非常大的影响,尤其是对用户画像、推荐...
  • ES 修改mapping

    千次阅读 2020-02-19 16:21:36
    场景 在mysql中 我们经常遇到产品修改需求 我们可能会在原有数据库表基础上 对字段 索引 ...ES的mapping一旦设置了之后 是不能修改的 因为ES默认是对所有字段进行索引 如果你修改了mapping 那么已经索引过的数据...
  • ElasticSearch之索引(index)和mapping

    千次阅读 2021-12-19 18:15:55
    但是, 不是所有的数值类型的数据都需要使用"数值"类型, 比如产品id, 会员id, ISDN(出版社编号), 这些很少会被进行范围查询, 通常都是精确匹配(term query). keyword类型的查询通常比numeric的要快, 如果不需要范围...
  • 七:es映射 mapping

    2020-05-21 17:38:15
    doc 如果要获取所有索引和类型的映射,则以下两个示例等效: GET /_all/_mapping GET /_mapping 1.3 Get Field Mapping 获取字段mapping 以下仅返回字段标题的映射: GET publications/_mapping/_doc/field/title ...
  • 同时数据安全也成为大家的关注问题,脱离数据上云,私有化服务成为大家的必选,对于好多中小型公司来说,去购买行业内的营销智能产品成本都点高,或者说是大才小用,现在我们就基于一个小案例来讲解和设计一下如何...
  • 这是彭文华的第153篇原创网上 ID Mapping 的技术文章不多,我正好经历过传统数据清洗和互联网 ID Mapping 两种场景,今天就把具体方法总结分享一下。欢迎大家加我微...
  • ES Mapping、字段类型Field type详解

    万次阅读 多人点赞 2018-10-15 15:02:18
    text取代了string,当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于...
  • 为啥要做ID Mapping? 其实技术都是为了解决实际业务问题的。如果没有数据孤岛的问题,也就不会有这波澜壮阔的数字技术发展和改革。 在 10 多年前的时候,当时IT界都还在做“四库十二金”的项目。我就接了这么一个活...
  • ElasticSearch7.4的数据类型,Mapping Type, 指定索引Document的Mapping Type 基础数据类型:(ELasticsearch 5.X之后的字段类型不再支持string,由text或keyword取代) 一、字符串 1.1 文本类型 text 当一个...
  • Surveying and Mapping核心期刊

    千次阅读 2019-01-31 21:20:01
    Surveying and Mapping核心期刊 测绘科学与技术(Surveying and Mapping)下设大地测量学与测量工程、摄影测量与遥感、地图制图学与地理信息工程三个研究方向。 Survering and Mapping核心期刊为我们介绍GIS、RS和...
  • 在深入讲解 ID-Mapping 之前,我们先讲一下什么是用户 ID。用户 ID 是描述真实世界中用户的数字化标识。在特定的上下文和生命周期中,这些标识通常具有唯一性。
  • 一共出现过两次类似的错误,其一是: Could not set parameters for mapping: ParameterMapping{property='id',其二是: Could not set parameters for mapping: ParameterMapping{property='time', 解决方案 两个bug...
  • mapping 是用来定义文档及其字段的存储方式、索引方式的手段,例如利用mapping来定义以下内容: 哪些字段需要被定义为全文检索类型 哪些字段包含number、date类型等 格式化时间格式 自定义规则,用于控制动态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,519
精华内容 16,207
关键字:

产品mapping