重生之我们在ES顶端相遇第5章-常用字段类型

news2024/12/22 8:59:55

思维导图

在这里插入图片描述

前置

在第4章,我们提到了 keyword(一笔带过)。在本章,我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。

字段类型

ES 支持以下字段类型(仅介绍开发中常用,更多内容请自行阅读 官方文档)。

Keyword
基本介绍

手动设置字段类型为 keyword

PUT /test3
{
  "mappings": {
    "properties": {
      "tags": {
        "type": "keyword"
      }
    }
  }
}

写入数据

PUT /test3/_doc/1
{
  "tags": "hello world"
}

keyword 其实就是字符串,输入什么,存储就是什么。

适用场景

keyword 适用于 排序、聚合、term(精确查询) 查询场景中。
例如

GET /test3/_search
{
  "query": {
    "term": {
      "tags": {
        "value": "hello"
      }
    }
  }
}
查询优化

有 2 个对查询优化重要的点:

  1. 数字类型(int, long)如果不需要使用范围查询,则建议设置为 keyword
  2. term 查询在 keyword 上的搜索速度总是快于数字类型。
Text
基本介绍

与 keyword 相对的则是 text。在第三章,我们介绍了全文搜索 match 的用法。你可能会好奇,为啥默认写入的数据就可以使用全文搜索。因为当输入是无规则字符串时,字段类型就是 text。(别着急,默认的字段类型,一会我们就会详细介绍)

手动设置字段类型为 text

# 先删除索引
DELETE test3

PUT /test3
{
  "mappings": {
    "properties": {
      "tags": {
        "type": "text"
      }
    }
  }
}
适用场景

text 适用场景:全文搜索
text 字段会对输入进行分词。
例如

PUT /test3/_doc/1
{
  "tags": "hello world"
}

tags 会被分词存储为 hello、world 2个词。
当然,具体被分词为什么,其实跟我们设置的分词器有关(后续讲解,这里先有个概念)。

不适用场景

text 不适用场景:排序、聚合、脚本。
如果你在 text 字段上,进行排序、聚合,或者脚本操作,都会收到以下异常。
Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.

例如:

GET /test3/_search
{
  "sort": [
    {
      "tags": {
        "order": "desc"
      }
    }
  ]
}

# 聚合
GET /test3/_search
{
  "size": 0,
  "aggs": {
    "popular_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

# 脚本操作
GET /test3/_search
{
  "query": {
    "script": {
      "script": "doc['tags'].value == 'hello'"
    }
  }
}
illegal_argument_exception 异常解决方式

要解决该异常,有2种方法

  1. 使用多字段类型,即在该字段上面再建一个 keyword 类型(强烈建议)
DELETE test3

PUT test3
{
  "mappings": {
    "properties": {
      "tags": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

排序、聚合时,则使用 tags.keyword。需要全文索引时,依然可以使用 tags 字段。

GET /test3/_search
{
  "sort": [
    {
      "tags.keyword": {
        "order": "desc"
      }
    }
  ]
}
  1. text 字段上启用 fielddata(不建议!不建议!不建议!)
DELETE test3

PUT /test3/_mapping
{
  "properties": {
    "tags": {
      "type": "text",
       "fielddata": true
    }
  }
}

PS:在 text 字段上启用 fielddata,会消耗非常大的内存!!!

Date

手动指定字段类型为 date

PUT /test3
{
  "mappings": {
    "properties": {
      "ctime": {
        "type": "date"
      }
    }
  }
}

未指定 format 参数时,默认的值为 strict_date_optional_time||epoch_millis
该默认值接收以下数据

# 秒时间戳
PUT /test3/_doc/1
{
  "ctime": 1721135125
}
# 毫秒时间戳
PUT /test3/_doc/2
{
  "ctime": 1721135125000
}
# datetime
PUT /test3/_doc/3
{
  "ctime":"2024-07-16T12:10:30Z"
}
# date
PUT /test3/_doc/4
{
  "ctime": "2024-07-15"
}

# 对数据排序
GET test3/_search
{
  "sort": { "ctime": "asc"} 
}
format 参数

我们可以手动指定允许的数据格式。例如

PUT /test3
{
  "mappings": {
    "properties": {
      "ctime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis||epoch_second"
      }
    }
  }
}
存储时间仅为秒时间戳

如果时间为秒时间戳,可以考虑使用 epoch_second

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "ctime": {
        "type":   "date",
        "format": "strict_date_optional_time||epoch_second"
      }
    }
  }
}

PUT /test3/_doc/1
{
  "ctime": 1721135125
}

# 以下查询,时间会被格式化
GET test3/_search
{
  "fields": [ {"field": "ctime"}]
}
数字类型

在复习一下,如果不需要范围查询,建议使用 keyword 存储(后续在进阶篇会讲原理)。

scaled_float

ES 除了支持常见的数字类型。如:long、integer、short、byte、double、float
还针对浮点数,有一个优化的类型 scaled_float
如果我们能够得知我们的浮点数最多有多少个小数点。使用该类型,在空间存储上会比浮点数更好。

PUT /test3
{
  "mappings": {
    "properties": {
      "sf": {
        "type": "scaled_float",
        "scaling_factor": 100
      }
    }
  }
}

上面的意思为:存储时,* 100。即,将浮点数变为整数。

Boolean
PUT /test3
{
  "mappings": {
    "properties": {
      "enable": {
        "type": "boolean"
      }
    }
  }
}
  • false, “false”, “” (empty string) 均被认为是 false
  • true, “true” 均被认为是 true
POST /test3/_doc
{
  "enable": false
}
POST /test3/_doc
{
  "enable": "false"
}
POST /test3/_doc
{
  "enable": ""
}
POST /test3/_doc
{
  "enable": true
}
POST /test3/_doc
{
  "enable": "true"
}

GET /test3/_search
{
  "query": {
    "term": {
      "enable": {
        "value": false
      }
    }
  }
}
Object

写入一个 manager 对象

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

在 ES 内部,该文档被索引为一个简单的键值对列表,大致如下

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

例如,我们可以查询 manager.age=30 的文档

GET /test3/_search
{
  "query": {
    "term": {
      "manager.age": {
        "value": 30
      }
    }
  }
}

上述文档的显式映射如下

PUT /test3
{
  "mappings": {
    "properties": { 
      "region": {
        "type": "keyword"
      },
      "manager": { 
        "properties": {
          "age":  { "type": "integer" },
          "name": { 
            "properties": {
              "first": { "type": "text" },
              "last":  { "type": "text" }
            }
          }
        }
      }
    }
  }
}
Array
  1. 不支持混合数据类型的数组
POST /test3/_doc
{
  "arr": ["12", 12, false]
}
  1. 无法查询数组中的每个对象
PUT test3/_doc/1
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

# 查询 user.first=Alice & user.last=White。你可能会使用以下写法,但实际上并不能正确工作

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

如果你的索引结构是这么设计的,并且有这样的需求,可能需要考虑下如何做优化了。例如,将表铺平。

PS:虽然 nested 嵌套类型可以解决该问题,但开发中会尽可能的把数据结构铺平,从而避免使用 nested 嵌套类型。这里不对 nested 过多介绍,因为开发中真的很不推荐使用。

  1. 开发中仅推荐基本数据类型数组,不推荐对象数组,如果你有第2 点描述的查询需求
PUT test3
{
  "mappings": {
    "properties": {
      "arr": {
        "type": "keyword"
      }
    }
  }
}

PUT test3/_doc/1
{
  "arr": ["1", "2", "3"]
}

GET test3/_search
{
  "query": {
    "term": {
      "arr": {
        "value": "1"
      }
    }
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口自动化测试框架实战-4-日志方法封装

上一小节我们讲解了文件读写方法的封装方法,本小节我们完成一下框架日志的封装方法。 首先我们讲解一下日志封装和日志记录有哪些用处? 更加方便的设置日志的格式和输出方式全局方法可以各个类/函数中都能统一调用分类记录接口用例执行日志,方便嵌入测试报告错误日志提示,…

乘云数字受邀Zabbix MeetUp济南站,分享《DataBuff在打造可观测性数据底座上的探索》

7月20日,Zabbix主办的MeetUp线下活动在济南圆满举行,众多技术大咖汇集现场,交流技术知识、分享先进的思想。乘云数字受邀参加此次盛宴,创始人兼CEO向成钢在现场发表了关于“DataBuff在打造可观测性数据底座上的探索”的主题演讲。…

【多模态】CLIP-KD: An Empirical Study of CLIP Model Distillation

论文:CLIP-KD: An Empirical Study of CLIP Model Distillation 链接:https://arxiv.org/pdf/2307.12732 CVPR 2024 Introduction Motivation:使用大的Teacher CLIP模型有监督蒸馏小CLIP模型,出发点基于在资源受限的应用中&…

NFTScan 浏览器现已支持 .mint 域名搜索功能!

近日,NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询, NFTScan 用户能够轻松地使用域名追踪 NFT 交易,为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…

C++树形结构(2 树的直径)

目录 1.定义: 2.直径的性质: 3.树的直径求解方法: 4.直径端点求解方法: 朴素方法: 优化方法: 5.例题: 6.直径公共点: 7.例题: 8.去掉再加上: 9.例…

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…

vue3前端开发-小兔鲜项目-图片切换效果和动态class

vue3前端开发-小兔鲜项目-图片切换效果和动态class!这次实现的效果是&#xff0c;图片预览效果&#xff0c;根据小图片&#xff0c;来实时改变大图&#xff08;预览&#xff09;的效果。同时让动态的特征class也跟着显示出来。 <script setup> import {ref} from vue // …

【Vue3】响应式数据

【Vue3】响应式数据 背景简介开发环境开发步骤及源码使用 ref 定义基本类型响应式数据使用 reactive 定义对象类型响应式数据使用 ref 定义对象类型响应式数据 ref 和 reactive 的对比使用原则建议 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈…

【C++初阶】string类

【C初阶】string类 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…

day07:用户下单、订单支付

文章目录 地址薄相关相关代码需求分析和设计代码书写 用户下单需求分析和设计代码开发 订单支付微信支付介绍微信支付准备工作如何保证数据安全&#xff1f;如何调用到商户系统 地址薄相关相关代码 需求分析和设计 产品原型接口设计数据库设计 代码书写 地址薄相关代码都是单…

【unity 新手教程 001/100】安装与窗口布局介绍

欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持&#xff01;&#x1f49c;&#x1f49c; Unity下载与安装 &#x1f449;点击跳转详细图文步骤&#xff1a;Unity Hub Unity 编辑器 窗口布局&#xff1a; Hierarchy: 层级窗口 | 默认 Sample Scene (main camera、direc…

三星Unpacked发布会即将举行:有新款折叠屏手机,还有智能戒指

随着7月的脚步渐近&#xff0c;科技界的目光再次聚焦于三星&#xff0c;它即将在法国巴黎举办今年的第二场Unpacked发布会。这不仅是一场新品的展示&#xff0c;更是三星对创新科技的一次深刻诠释。 从Galaxy Z Fold 6的全新设计&#xff0c;到Galaxy Z Flip 6的显著升级&…

MySQL数据库练习(四)

1.建库建表 # 创建数据库 create database mydb15_indexstu;# use mydb15_indexstu;# 学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在系的默认值是“计算机”&#xff0c;结构如下:student(Sno 学号&#xff0c;…

C#中的线性表

什么是线性表 线性表是最简单、最基本、最常用的数据结构。线性表是线性结构的抽象(Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系。这种一对一的关系指的是数据元素之间的位置关系,即:(1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数…

基于python的京东VR眼镜口碑情感分析,包括lda和情感分析

第1章 绪论 1.1选题背景 在当今科技发展迅速的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术作为一种前沿的数字体验方式受到越来越多人的关注。京东作为中国领先的电商平台&#xff0c;推出的VR眼镜备受消费者关注。通过对京东VR眼镜口碑进行情感分析&#xff0c…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块-B-4Web渗透测试

前言 本章节我将尝试操作B-4模块的渗透测试&#xff0c;搭建环境很难&#xff0c;还望大家点点赞多多支持&#xff01; 任务概览 最后4、5、6有一定的难度。 环境要求 kali Linux192.168.41.2Web服务器&#xff08;假设为PYsystem 2020 模拟平台&#xff09;192.168.41.7交换…

AGV平面坐标系变换公式及实例

1、AGV坐标系简介 如上图&#xff0c;小车前后对角是有激光雷达的&#xff0c;其坐标系称为激光坐标系&#xff0c;采用极坐标系体现。中间为车体坐标系&#xff0c;激光坐标系相对于车体坐标系关系不变&#xff1b;左下角是地图坐标系&#xff0c;小车扫图后&#xff0c;建立的…

PCIE的GT计算

在PCIe总线中&#xff0c;使用GT(Gigatransfer)计算PCIe链路的峰值带宽。GT是在PCIe链路上传递的峰值带宽&#xff0c;其计算公式为总线频率数据位宽2。

JMeter的使用方法及https的使用方法

软件安装&#xff1a; 参考链接&#xff1a;JMeter 下载安装及环境配置&#xff08;包含jdk1.8安装及配置&#xff09;_jmeter5.2.1需要什么版本的jdk-CSDN博客 前置知识储备&#xff1a; Https请求的案例: JMeter的第一个案例 增加线程数 线程&#xff08;thread&#xff…

视频行业(监控,直播,会议,视频通话)痛点,随时接入,异构融合,以OvMeet视频会议为中心解决企业视频应用完美解决方案

近年来随着网络的普及及音视频技术的不断发展&#xff0c;以全球化、网络化、智能化未趋势的办公方式越来越受到各行各业的青睐。视频会议解决方案的应用转往多种交互式视频应用&#xff0c;如转往视频接入融合&#xff0c;调度与管理、日常沟通、工作部署、紧急救援、作战指挥…