ElasticSearch之数据建模

写在前面

本文看下es数据建模相关的内容。

1:什么是数据建模

数据建模是对真实数据的一种抽象,最终映射为计算机形式的表现。其包括如下三个阶段:

1:概念模型
2:逻辑模型
3:数据模型

2:es数据建模的过程

es的数据建模其实就是确定各个字段都需要如何进行设置,什么类型?是否需要搜索?等,具体需要考虑的问题如下:
在这里插入图片描述

注意以上四个要素没有先后的顺序,而只是需要综合考虑的因素。

2.1:数据类型

为了选择合适的数据类型,我们来看下每种数据类型的特点。

2.1.1:text

默认会被分词器分词,可以搜索,但是不支持聚合和排序,如果想要支持的话需要显式将fielddata设置为true。

2.1.2:keyword

不会被分词,所以一般用在不需要分词时使用,如主键id,邮箱,手机号,身份证号等。支持聚合,搜索和排序,以及用于查询时精确匹配方式的过滤。

2.1.3:多字段类型

当希望一个数据按照多种的数据类型来存储,从而满足诸如按照不同的分词器进行分词,按照不同的查询条件进行查询(如存储为int则可以按照range来查询),但又不希望设置多个字段时使用。默认的在es中如果时字段时text类型的,则会默认添加一个名称为keyword的keyword类型的字段,当然实际工作中我们我们不需要这个默认行为则可以通过显式mapping来自己定义。

2.1.4:数值类型

数值类型是一种结构化数据,数值类型应该尽量设置能够满足存储要求的最小类型,如可以设置为byte,就不要设置为long。

2.1.5:枚举类型

枚举类型是一种结构化数据,建议设置为keyword,以获得更好的性能。

2.1.6:日期,布尔,地理信息等

设置为对应的类型即可。

2.2:搜索,聚合,排序

  • 搜索
    是否需要被搜索,也是对字段进行建模时要考虑的一个重要因素,因为搜索功能需要分词,以及创建对应的倒排索引数据结构,所以需要额外的存储消耗,以及构建对应数据结构的性能消耗。
  • 聚合,排序
    聚合和排序功能需要依赖于doc_values,和fielddata,需要简历对应的数据结构来满足聚合和排序功能,因此也会有对应的存储成本,和对应数据结构的维护成本。
    对于这三个因素可从以下方面进行考虑:
1:如果是同时不需要搜索,聚合和排序,则可考虑设置enable=false,不存储_source(还需要注意不存储_source的话将无法reindex和更新)
2:如果是不需要搜索,则可以设置index:false
3:如果不需要聚合和排序,则可以设置doc_values和fielddata为false
4:如果是更新频繁,聚合频繁,则可考虑设置keyword类型的eager_global_ordinals为true,可以利用缓存来提高性能。

2.3:额外存储字段值

如果希望额外存储字段值,则可以设置store:true,一般结合enbled:false使用。

enabled:false一般应用在一些指标数据的存储上,这些数据不需要reindex,更新。此时如果还希望查看某些字段的话则可以设置store为true。

但是实际的应用中不建议直接设置enabled:false,而是考虑使用高压缩的存储方式来减少存储的开销。

2.4:数据建模优化实例

假定我们要对如下的数据进行建模:
在这里插入图片描述
如下是默认生成的mapping:
在这里插入图片描述
其中cover_url被自动映射为text类型,并增加keyword类型的子字段,如下:

# 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

在这里插入图片描述
假定根据实际的业务需求,cover url不需要支持搜索,只需要支持聚合即可,此时我们就可以将其显式的设置为keyword,并将index设置为false,如下:

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
          }
        }
      }
    }
  }
}

GET books/_mapping

在这里插入图片描述
此时cover_url因为设置了index:false就不支持搜索了:

#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
      }
    }
  }
}

在这里插入图片描述
假定需求发生变更,要求将文章的内容存储在content字段中,并且不需要做更新和reindex。

考虑到content内容比较大,所以如果放在_source中返回的话会占用比较多的网络带宽资源,并且数据查询到额速度也会降低,所以为了解决这个问题,我们可以考虑如下的两种方案:

1:source filtering不返回数据,特别是content
2:设置enabled:false,并设置字段store:true

其中对于1:source_fitering 只是在返回给客户端时不返回,在汇总数据时还是返回的,如下图:
在这里插入图片描述
所以对于这个需求我们需要通过2设置enabled:false来解决。

如下在mapping中显式设置enabled:false:

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:true所以会存储字段的原始值(但是enabled:false所以原始文档是不存储的,即_source是没有信息的)

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

在这里插入图片描述

写在后面

参考文章列表

source filtering 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/488637.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

案例分享:F5助力车企打造智能高效自动化应用

纵观当下的汽车市场,智能汽车百花齐放。自动驾驶、车载娱乐、实时3D地图等实现人机互动的出行场景,解锁着全新的出行方式。然而得到独特而先进的智能用车体验,离不开持续而深入的汽车应用变革。那么怎样打造智能高效的自动化应用呢&#xff1…

JavaWeb后端——HTTP协议/Tomcat

HTTP HTTP协议:无状态,对事务处理没有记忆能力。每次请求-响应都是独立的。后一次请求不会记录前一次请求数据。缺点:多次请求之间不能共享数据,优点:速度快。 HTTP协议请求报文: HTTP协议响应报文&#x…

(MATLAB)第二十一章 Simulink仿真设计初步

Simulink是MATLAB的重要组成部分,可以非常容易地实现可视化建模,并把理论研究和工程实践有机地结合在一起,不需要书写大量程序,只需要使用鼠标和键盘对已有模块进行简单的操作和设置。 21.1 Simulink简介 Simulink是MATLAB软件的…

一、Java开发环境搭建-----系统类的简单使用

JavadocAPI文档练习: 1、Date类的使用——代码实战 Date类为日期类,是Java中和日期相关的一个类,如下将日期做一个简单的介绍。 package com.kangning.web.controller.common;import java.util.Date;public class DateDemo1 {public static…

SAP/ERP系统PP模块常用增强之二:报表COOIS增加字段

SAP/PP模块中的COOIS报表(订单信息系统)是最常用的标准报表之一,它可以查询有关生产订单的完整信息,但实际项目实施中也会经常遇到这个报表增强需求,一般要求增加一些产品相关的一些额外信息。 SAP系统为此类需求预留第三代BADI增强出口,可以非常方便的实现在COOIS报表中…

水泊梁山108小酒坛之小李广花荣

小李广花荣,是中国著名小说《水浒传》中的108将之一,有“百步穿杨”的功夫。在梁山泊英雄中排行第九,为马军八虎骑兼先锋使之首。原是清风寨副知寨,使一杆银枪,一张弓射遍天下无敌手,生得一双俊目&#xff…

谈谈消息队列

这篇文章我们来聊聊消息队列。我一直在想,能不能用一篇文章就把消息队列的所有内容给串联起来。然后,之后每次看到这篇文章的时候,我就能够立马回忆起来这个大知识的所有知识点。所以我想尝试一下用这种长文的方式,将我自己对于消…

财富池指标公式--通达信资金进场买入提示指标公式

1、“准备现金”信号出现,可开始关注该个股,等待合适价位介入,较为激进的投资者也可在此时介入,更稳健的做法是,等到“买入股票”信号出现后再介入。 2、“见顶清仓”信号出现,预示着即将见顶,是…

Matlab从入门到精通课程

教程介绍 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 学习地址 链接:https://pan.baidu.com/s/1PxGarBwQusMzwPVqcE…

【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、while 循环语法结构 二、while 循环 - 代码示例1、打印数字2、计算 1 - 10 之和 一、while 循环 1、while 循环概念 在 JavaScript 中 , while 循环 是一种 " 循环控制语句 " , 使用该语句就可以 重复执行一段代码块 , …

如何使用 ArcGIS Pro 制作三维建筑

三维地图已经逐渐成为未来地图的趋势,对于大范围应用,只需要普通的建筑体块就行,如果有高程数据,还可以结合地形进行显示,这里为大家介绍一下 ArcGIS Pro 制作三维建筑的方法,希望能对你有所帮助。 数据来…

Kimi是什么?免费Kimi chat介绍

1. Kimi是什么? Kimi是由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手,专注于提供高质量的对话和信息处理服务。 月之暗面公司创立于2023年3月,创始团队核心成员参与了Google Gemini、Google Bard、盘古NLP、…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二:布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…

✮✮✮宁波CE认证,CE认证,CE产品检测✮✮✮

✮✮✮🌈宁波CE认证,🌈CE认证,🌈CE产品检测🌈✮✮✮ ❀热点:😘CE认证什么意思 ❀优势:😜CE认证的目的 ✎🍒CE认证定义和目的 ✎🍐CE认…

李宏毅深度强化学习导论——演员-评论员

引言 本文主要介绍演员-评论员(Actor-Critic)算法。 Critic 给定Actor θ \theta θ,Critic评估当观测到 s s s(或进一步地采取行动 a a a)的好坏。 价值函数(Value function),记为 V θ ( s ) V^\theta(s) Vθ(s),就是一种Critic。 它的…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

【python】flask各种版本的项目,终端命令运行方式的实现

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Java:ArrayList与顺序表

一、线性表 线性表是n个具有相同特征的数据元素的有限序列&#xff0c;它是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列...... 如图&#xff1a;顺序表与链表的区别看了标题的伙伴就应该知道&#xff0c;我们这次要讲解的主…

【浏览器渲染-输入Url到页面渲染全流程】

概述 在面试题中有一道经典面试题就是浏览器输入url之后发送了什么&#xff0c;看了下网上的大多数文章都感觉不太全&#xff0c;所以这里梳理了比较全的流程&#xff0c;如果有误&#xff0c;欢迎评论指正。本文大致是从以下内容概览入手&#xff0c;有需要的可以跳转到感兴趣…

初识C++(三)构造函数和析构函数

目录 一、构造函数&#xff1a; 1.构造函数的概念&#xff1a; 2.构造函数的特性&#xff1a; 3.构造函数的形式&#xff1a; 4.为什么要引出构造函数这一概念 5.默认构造函数包括&#xff1a; 6.对默认生成的构造函数不处理内置类型的成员这事的解决办法&#xff1a; …