美文网首页
7.5-Elasticsearch数据建模实例

7.5-Elasticsearch数据建模实例

作者: 落日彼岸 | 来源:发表于2020-04-29 16:52 被阅读0次

    什么是数据建模?

    • 数据建模(Data modeling), 是创建数据模型的过程

      • 数据模型是对真实世界进⾏抽象描述的⼀种⼯具和⽅法,实现对现实世界的映射

        • 博客 / 作者 / ⽤户评论
      • 三个过程:概念模型 => 逻辑模型 => 数据模型(第三范式)

        • 数据模型:结合具体的数据库,在满⾜业务读写性能等需求的前提下,确定最终的定义

    数据建模:功能需求 + 性能需求

    image.png

    如何对字段进⾏建模

    image.png

    字段类型:Text v.s Keyword

    • Text

      • ⽤于全⽂本字段,⽂本会被 Analyzer 分词

      • 默认不⽀持聚合分析及排序。需要设置 fielddata 为 true

    • Keyword

      • ⽤于id,枚举及不需要分词的⽂本。例如电话号码,email地址,⼿机号码,邮政编码,性别等

      • 适⽤于 Filter(精确匹配),Sorting 和 Aggregations

    • 设置多字段类型

      • 默认会为⽂本类型设置成 text,并且设置⼀个 keyword 的⼦字段

      • 在处理⼈类语⾔时,通过增加“英⽂”,“拼⾳”和“标准”分词器,提⾼搜索结构

    字段类型 :结构化数据

    • 数值类型

      • 尽量选择贴近的类型。例如可以⽤ byte,就不要⽤ long
    • 枚举类型

      • 设置为 keyword。即便是数字,也应该设置成 keyword,获取更加好的性能
    • 其他

      • ⽇期 / 布尔 / 地理信息

    检索

    • 如不需要检索,排序和聚合分析

      • Enable 设置成 false
    • 如不需要检索

      • Index 设置成 false
    • 对需要检索的字段,可以通过如下配置,设定存储粒度

      • Index_options / Norms :不需要归⼀化数据时,可以关闭

    聚合及排序

    • 如不需要检索,排序和聚合分析

      • Enable 设置成 false
    • 如不需要排序或者聚合分析功能

      • Doc_values / fielddata 设置成 false
    • 更新频繁,聚合查询频繁的 keyword 类型的字段

      • 推荐将 eager_global_ordinals 设置为 true

    额外的存储

    image.png
    • 是否需要专⻔存储当前字段数据

      • Store 设置成 true,可以存储该字段的原始内容

      • ⼀般结合 _source 的 enabled 为 false 时候使⽤

    • Disable _source:节约磁盘;适⽤于指标型数据

      • ⼀般建议先考虑增加压缩⽐

      • ⽆法看到 _source字段,⽆法做 ReIndex,⽆法做 Update

      • Kibana 中⽆法做 discovery

    ⼀个数据建模的实例

    image.png
    • 图书的索引

      • 书名

      • 简介

      • 作者

      • 发⾏⽇期

      • 图书封⾯

    优化字段设定

    image.png
    • 图书的索引

      • 书名:⽀持全⽂和精确匹配

      • 简介:⽀持全⽂

      • 作者:精确值

      • 发⾏⽇期:⽇期类型

      • 图书封⾯:精确值

    需求变更

    • 新需求:增加图书内容的字段。并要求能被搜索同时 ⽀持⾼亮显示

    • 新需求会导致 _source 的内容过⼤

      • Source Filtering 只是传输给客户端时进⾏过滤, Fetch 数据时,ES 节点还是会传输 _source 中的数据
    • 解决⽅法

      • 关闭 _source

      • 然后将每个字段的 “store” 设置成 true

    #新增 Content字段。数据量很大。选择将Source 关闭
    PUT books
    {
          "mappings" : {
          "_source": {"enabled": false},
          "properties" : {
            "author" : {"type" : "keyword","store": true},
            "cover_url" : {"type" : "keyword","index": false,"store": true},
            "description" : {"type" : "text","store": true},
             "content" : {"type" : "text","store": true},
            "public_date" : {"type" : "date","store": true},
            "title" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 100
                }
              },
              "store": true
            }
          }
        }
    }
    

    查询图书:解决字段过⼤引发的性能问题

    • 返回结果不包含 _source 字段

    • 对于需要显示的信息,可以在在查询中指定 “stored_fields"

    • 禁⽌ _source 字段后,还是⽀持使⽤ highlights API,⾼亮显示 content 中匹配的相关信息

    #搜索,通过store 字段显示数据,同时高亮显示 conent的内容
    POST books/_search
    {
      "stored_fields": ["title","author","public_date"],
      "query": {
        "match": {
          "content": "searching"
        }
      },
    
      "highlight": {
        "fields": {
          "content":{}
        }
      }
    
    }
    

    Mapping 字段的相关设置

    • https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-params.html

      • Enabled – 设置成 false,仅做存储,不⽀持搜索和聚合分析 (数据保存在 _source 中)

      • Index – 是否构倒排索引。设置成 false,⽆法被搜索,但还是⽀持 aggregation,并出现在 _source 中

      • Norms – 如果字段⽤来过滤和聚合分析,可以关闭,节约存储

      • Doc_values – 是否启⽤ doc_values,⽤于排序和聚合分析

      • Field_data – 如果要对 text 类型启⽤排序和聚合分析, fielddata 需要设置成true

      • Store – 默认不存储,数据默认存储在 _source。

      • Coerce – 默认开启,是否开启数据类型的⾃动转换(例如,字符串转数字)

      • Multifields 多字段特性

      • Dynamic – true / false / strict 控制 Mapping 的⾃动更新

    ⼀些相关的 API

    • Index Template & Dynamic Template

    • 根据索引的名字匹配不同的 Mappings 和 Settings

    • 可以在⼀个 Mapping 上动态的设定字段类型

    • Index Alias

    • ⽆需停机,⽆需修改程序,即可进⾏修改

    • Update By Query & Reindex

    本章知识点

    • 数据建模对功能与性能⾄关重要

      • Mapping. & Setting

      • 字段 Mapping 参数的⼀些回顾,分⽚的设定,会在后续讲解

    • 通过具体的实例,学习了数据建模时需要考虑的点

      • 确定字段类型

      • 是否需要搜索和聚合以及排序

      • 是否需要禁⽌ _source 以及打开 store

    课程demo

    ###### Data Modeling Example
    
    # Index 一本书的信息
    PUT books/_doc/1
    {
      "title":"Mastering ElasticSearch 5.0",
      "description":"Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins",
      "author":"Bharvi Dixit",
      "public_date":"2017",
      "cover_url":"https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
    }
    
    
    
    #查询自动创建的Mapping
    GET books/_mapping
    
    DELETE books
    
    #优化字段类型
    PUT books
    {
          "mappings" : {
          "properties" : {
            "author" : {"type" : "keyword"},
            "cover_url" : {"type" : "keyword","index": false},
            "description" : {"type" : "text"},
            "public_date" : {"type" : "date"},
            "title" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 100
                }
              }
            }
          }
        }
    }
    
    #Cover URL index 设置成false,无法对该字段进行搜索
    POST books/_search
    {
      "query": {
        "term": {
          "cover_url": {
            "value": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
          }
        }
      }
    }
    
    #Cover URL index 设置成false,依然支持聚合分析
    POST books/_search
    {
      "aggs": {
        "cover": {
          "terms": {
            "field": "cover_url",
            "size": 10
          }
        }
      }
    }
    
    
    DELETE books
    #新增 Content字段。数据量很大。选择将Source 关闭
    PUT books
    {
          "mappings" : {
          "_source": {"enabled": false},
          "properties" : {
            "author" : {"type" : "keyword","store": true},
            "cover_url" : {"type" : "keyword","index": false,"store": true},
            "description" : {"type" : "text","store": true},
             "content" : {"type" : "text","store": true},
            "public_date" : {"type" : "date","store": true},
            "title" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 100
                }
              },
              "store": true
            }
          }
        }
    }
    
    
    # Index 一本书的信息,包含Content
    PUT books/_doc/1
    {
      "title":"Mastering ElasticSearch 5.0",
      "description":"Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins",
      "content":"The content of the book......Indexing data, aggregation, searching.    something else. something in the way............",
      "author":"Bharvi Dixit",
      "public_date":"2017",
      "cover_url":"https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
    }
    
    #查询结果中,Source不包含数据
    POST books/_search
    {}
    
    #搜索,通过store 字段显示数据,同时高亮显示 conent的内容
    POST books/_search
    {
      "stored_fields": ["title","author","public_date"],
      "query": {
        "match": {
          "content": "searching"
        }
      },
    
      "highlight": {
        "fields": {
          "content":{}
        }
      }
    
    }
    

    相关文章

      网友评论

          本文标题:7.5-Elasticsearch数据建模实例

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