Elasticsearch 数据类型相关总结:快速参考指南【记录】

在Elasticsearch中,有多种数据类型可用于定义字段。

在开始了解数据类型之前,首先要知道,在Elasticsearch中,分词处理主要针对文本字段,而对于其他类型字段(如数值、日期、布尔等),通常不会进行分词处理。这是因为文本字段需要支持全文搜索、模糊匹配和文本分析,而其他类型字段通常用于精确匹配和聚合计算,不需要进行分词。

一、了解字符串类型(string)

在ES早期版本有一个string数据类型,使用string类型时,有两种用法(通过index来区分):

全文检索分词index=analysis按单个字符匹配被称作analyzed字符串
关键词搜索不分词index=not_analysis按照整个文本进行匹配被称为not-analyzed字符串

Elasticsearch在5.0版本中引入了text和keyword数据类型用于替代string类型。

下面我们通过一个示例来对比,ES分别如何使用string和text/keyward来创建索引:

例:假设我现在要创建名为my_index的索引,包含一个tag的字段(分词),以及一个foo的字段(不分词):

1)在Elasticsearch2.0版本的DSL语句:

PUT /my_index
{"mappings": {"_doc":{"properties": {"tag": {"type": "string","index": "analyzed"},"foo": {"type": "string","index": "not_analyzed"}}}}
}

2)在Elasticsearch5.0版本的DSL语句:

PUT /my_index
{"mappings": {"_doc":{"properties": {"tag": {"type": "text","analyzer": "standard"},"foo": {"type": "keyword"}}}}
}

总结:简而言之,无非就是5.0版本为string找了一个替代方案,text(分词)用于全文检索,keyword(不分词)用于聚合和排序。

扩展:在Elasticsearch中,"analyzer"是用于指定文本字段如何被分析的部分。它定义了在建立索引时和搜索时如何处理文本数据的过程。在提供的示例中,"analyzer"属性指定了"standard"分析器,这意味着文本字段将使用标准分析器进行处理。标准分析器将文本分成单词,并且会根据一些规则进行标准化,例如将单词转为小写。

注意:在Elasticsearch中,在创建索引定义mapping映射时,如果您只有一个字段,可以省略"properties",直接将字段定义放在"_doc" 下。这种情况下,您可以简化索引的创建过程。

注意:从Elasticsearch 7.0版本开始,一个索引只能包含一个类型,因此在创建索引时可以省略type。在示例中,我已经省略了type,因为在较新的Elasticsearch版本中,这是一个可选的设置。

二、简单的数据类型

1、文本类型(text):当一个字段是要被全文检索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。文本类型通常用于存储文本数据,支持全文搜索和分析。

2、关键字类型(keyword):这种类型适用于结构化的字段,例如:标签、email地址、手机号等,这种类型的字段可以用作过滤、排序、聚合等。用于存储关键字数据,不会被分词,通常用于精确匹配和聚合操作。

3、Numeric类型:用于存储数值类型的数据,包括整数类型(integer、long、short、byte)和浮点数类型(float、double),Numeric类型支持范围查询、排序和聚合操作,在满足需求的情况下,优先使用范围小的字段。字段长度越短,索引和搜索的效率越高。

  • Integer类型(integer):用于存储整数数据,支持有符号的32位整数,范围为-2^312^31-1

  • Long类型(long):用于存储长整数数据,支持有符号的64位整数,范围为-2^632^63-1

  • Short类型(short):占用2个字节,范围为-32,768至32,767;

  • Byte类型(byte):占用1个字节,范围为-128至127;

  • Float类型(float):用于存储单精度浮点数数据,占4个字节;

  • Double类型:用于存储双精度浮点数数据,占8个字节;

下面是一个创建数值类型字段的示例,其它字段同理:

PUT /my_index
{"mappings": {"_doc": {"amount": {"type": "integer"}}}
}

4、日期类型(date):用于存储日期和时间数据,由于JSON中没有日期类型,所以es中的日期类型形式比较多样。

  • 包含格式化日期的字符串, “2024-01-016"或"2024/01/16 12:10:30”;
  • 代表时间毫秒数的长整型数字;
  • 代表时间秒数的整数。

如果在Elasticsearch中未指定日期类型的格式,则默认格式是 “strict_date_optional_time||epoch_millis”。strict_date_optional_time 表示日期时间格式,epoch_millis 表示以毫秒为单位的时间戳。这意味着Elasticsearch会尝试解析日期字符串,如果失败,它将尝试解析为时间戳。

1)使用日期格式示例:

## 创建索引,添加映射
PUT my_index
{"mappings": {"_doc": {"pub_date": {"type": "date"}}}
}## 添加数据
PUT my_index/_doc/11
{ "pub_date": "2018-10-10" }
## Solr中默认使用的日期格式
PUT my_index/_doc/11
{ "pub_date": "2018-10-10T12:00:00Z" }## 时间的毫秒值
PUT my_index/_doc/11
{ "pub_date": "1589584930103" }

2)多种日期格式:多个格式使用双竖线||分隔, 每个格式都会被依次尝试, 直到找到匹配的。

## 添加映射
PUT my_index
{"mappings": {"_doc": {"pub_date": {"type": "date", ## 可以接受如下类型的格式"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"}}}
}

5、布尔类型(boolean):用于存储布尔值,可以接受表示真、假的字符串或数字。

  • 真值: true、“true”、“on”、“yes”、“1”…
  • 假值: false、“false”、“off”、“no”、“0”、“”(空字符串)、0.0、0

6、 二进制型(binary):二进制类型是Base64编码字符串的二进制值,不以默认的方式存储,且不能被搜索。用于存储二进制数据,如图片、音频或视频文件。

## 添加映射
PUT my_index
{"mappings": {"_doc": {"properties": {"title": {"type" : "text"}"blob": {"type": "binary"}}}}
}
## 添加数据
PUT my_index/_doc/1
{"title": "Some binary blog","blob": "hED903KSrA084fRiD5JLgY=="
}

注意:在Elasticsearch中,Base64编码的二进制值应该是连续的,不应该包含换行符\n

7、范围类型(range):range类型支持以下几种:

在这里插入图片描述
(1) 添加映射:

PUT /company
{"mappings": {"properties": {"expected_number": {"type": "integer_range"},"time_frame": {"type": "date_range","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"},"ip_whitelist": {"type": "ip_range"}}}
}

(2) 添加数据:

POST /company/_doc
{"expected_number": {"gte": 100,"lte": 500},"time_frame": {"gte": "2022-01-01","lte": "2023-01-01"},"ip_whitelist": "192.168.1.0/24"
}

(3) 查询数据:

GET /company/_search
{"query": {"range": {"expected_number": {"gte": 200}}}
}

查询结果:

{"took": 3,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "company","_type": "_doc","_id": "1","_score": 1.0,"_source": {"expected_number": {"gte": 100,"lte": 500},"time_frame": {"gte": "2022-01-01","lte": "2023-01-01"},"ip_whitelist": "192.168.1.0/24"}}]}
}

三、复杂的数据类型

暂时整理到这里,下面类型详细内容,后续抽空补充

1、Array类型:用于存储数组数据。Array类型可以包含多个相同或不同类型的元素,并支持按数组中的某个元素进行查询。

2、Object类型:用于存储复杂的结构化数据。Object类型类似于关系型数据库中的行,可以包含多个属性字段。

3、嵌套类型(nested):嵌套类型是对象数据类型的一个特例, 可以让array类型的对象被独立索引和搜索。

3、Geo类型(geo_point):用于存储地理位置数据。Geo类型支持点、线、多边形等地理形状的索引和查询。

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

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

相关文章

周五的胡思乱想

众所周知 csdn 在程序员的心目中是比较逊色的, 因为博客水平的参差不齐, 大部分人也都是用来作为自己的笔记方便未来复制。这样就导致这里的文章都是点到为止,没有去深究问题的根本原因,大家也都是复制一下解决方案就关闭的页面。或许这就是 csdn 的价值…

免费chartGPT网站汇总--

https://s.suolj.com - (支持文心、科大讯飞、智谱等国内大语言模型,Midjourney绘画、语音对讲、聊天插件)国内可以直连,响应速度很快 很稳定 https://seboai.github.io - 国内可以直连,响应速度很快 很稳定 http://gp…

智能开发助手——华为云CodeArts Snap,揭开智能研发新篇章

AIGC浪潮席卷全球,大模型技术应用到软件开发领域,正在颠覆传统的软件工程。华为云CodeArts Snap是一款基于大模型技术打造的智能开发助手,旨在提高开发人员的生产力和代码质量,为开发者带来全新的编程方式和体验。 ▶华为云智能开…

视频直播新时代,低延时直播交互,Web,Android,WebRtc推流拉流测试

直播现在已经深入了生活,学习,工作和娱乐方方面面,由于前些年的技术所限,传统rtmp,flv,m3u8 技术让直播快速启动项目产品,但也有很多不足,特别的交互式直播,一直是其中的痛点,延时较…

《剑指 Offer》专项突破版 - 面试题 16 : 不含重复字符的最长子字符串(C++ 实现)

题目链接:LCR 016. 无重复字符的最长子串 - 力扣(LeetCode) 题目: 输入一个字符串,求该字符串中不含重复字符的最长子字符串的长度。例如,输入字符串 "babcca",其最长的不含重复字符…

Oracle学习笔记——基础一起学 14

第十四天 DECODE的简单例子 用case实现 --DECODE的简单例子 --用case实现 select id,name, case sex when 1 then 男 when 2 then 女 end 性别 from student; --DECODE取出一行内两列中的较大值 --先建表 create table sales(month char(2),sales_tv number,sales_…

C#MQTT编程07--MQTT服务器和客户端(wpf版)

1、前言 上篇完成了winform版的mqtt服务器和客户端,实现了订阅和发布,效果666,长这样 这节要做的wpf版,长这样,效果也是帅BBBB帅,wpf技术是cs程序软件的福音。 wpf的基础知识和案例项目可以看我的另一个专…

Spring 如何解决循环依赖?

Spring解决循环依赖的主要方式是通过使用三级缓存(three-level cache)来管理Bean的创建过程。Spring容器在创建Bean时,会将Bean的创建状态存储在三级缓存中,以解决循环依赖的问题。 以下是Spring解决循环依赖的基本原理&#xff…

Parade Series - RTSP - Web

Cron Startup Scripts └─ lt-init.cmd├─ lt-server.cmd│ └─ lt-rtsp-proxy-server.cmd│ └─ lt-rtsp-proxy-agent.cmd└─ lt-push.cmd└─ lt-rtsp-cam-daemon.cmd└─ lt-rtsp-cam-worker.cmdlt-init.cmd :: :: PLEASE DO NOT EDIT THIS FILE :: ECHO OFF…

Qt —— 编译Qt5版本QFTP库,并实现连接服务、获取列表、上传、下载、删除文件等操作(附源码、附基于Qt5编译好的QFTP库)

示例效果1 示例效果2 介绍 QFTP是Qt4的库,Qt5改用了QNetworkAccessManager来代替。但是Qt5提供的QNetworkAccessManager仅支持FTP的上传和下载,所以只能将QFTP库编译为Qt5的库来进行调用。 QFTP在Github的下载地址:https://github.com/qt/qtftp 客户端源码生成的release结果…

安全 漏洞扫描 OSSIM

安全 漏洞扫描OSSIM OSSIM (4)硬件选择,可以采用品服务器,对于中小企业也可以根据自己需求,以OSSIM 4.8系统为例,目前系统对多核性能支持的比较好,推荐采用至强E系列处理器,OSSIM在…

IDEA项目启动报错之Command too long

使用IDEA最新的版本2023-3月份社区版本,启动之前没问题的项目突然报错如下: Error running VipServiceApplication: Error running // VipServiceApplication.Command line is too long. Shorten the command line via // JAR manifest or via a // clas…

开发安全之:Log Forging

Overview error_log($content . "\r\n", 3, $this->logFile);,该代码将未经验证的用户输入写入日志。攻击者可以利用这一行为来伪造日志条目或将恶意内容注入日志。 Details 在以下情况下会发生 Log Forging 的漏洞: 1. 数据从一个不可…

运放【之噪声】

电流噪声和电压噪声 我们一般评估噪声,还看对输出端噪声电压的贡献,因为电流乘以电阻等于电压,因此,最终的噪声大小还跟电路中电阻的取值有很大关系。显然,电阻越大,那么噪声电压就越大。反之电阻越小&…

设计模式——建造者模式(Builder Pattern)

概述 建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一…

09 STM32 - PWM

9.1 PWM简介 脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 9.2 PWM波原理 如下图所示,使用定时器定时,从0开始&#x…

Ubuntu系统Git的安装配置及使用笔记(更新中)

Ubuntu下Git的下载及配置 (1)、下载git 打开终端命令窗口,输入:sudo apt-get install git 提示:sudo命令是用来以其他身份来执行命令,预设的身份为root,使用sudo时必须先输入密码 (2)、可以使用命令git --version查看git的版本号 (3)、设置…

项目中常用的ahoos

项目中常用的ahoos如下 useMount、useUnmountuseRequestuseBooleanuseInfiniteScrolluseLocalStorageStateuseInViewportuseUpdateEffectuseLayoutEffectuseMapuseThrottleFnuseDebounceFn

Java内置锁:深度解析StampedLock并发类

内容摘要 StampedLock类是一种高性能的读写锁,它通过引入乐观读和写锁的优化机制,提高了多线程环境下的并发性能,他支持三种访问模式:悲观读、写和乐观读,可以根据不同的业务场景选择适合的锁策略,相比传统…

基于云化测试平台的功能拨测与告警

一、前言 1、拨测是什么 拨测是指对系统、应用或网站进行测试,以确定其是否正常工作。在软件开发的不同阶段,拨测都扮演着至关重要的角色。它可以帮助开发团队及时发现和解决问题,确保软件的质量和稳定性。 虽然拨测是保证软件质量的必要步…