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

news2024/9/24 17:36:18

在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.coloradmin.cn/o/1397524.html

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

相关文章

绑定class,条件渲染,列表过滤,列表排序

目录​​​​​​​ 绑定class 条件渲染 列表过滤 列表排序 绑定class <div class"normal" :class"mood" click"changename">111{{name}}</div><div class"normal" :class"arr">111{{name}}</div…

使用golang对接微软Azure AI翻译

文章目录 一、官方地址二、准备工作三、代码示例 一、官方地址 https://learn.microsoft.com/zh-CN/azure/ai-services/translator/translator-text-apis?tabsgo 二、准备工作 创建服务 创建服务连接地址&#xff1a;https://portal.azure.com/#create/Microsoft.CognitiveS…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

1.15io网络

子网掩码 1.由于对于一个网络下面的主机号还是很庞大&#xff0c;为了进一步划分网络&#xff0c;我们可以将主机号再次进行划分为两部分&#xff0c;分别是网段号和主机号 2.此时就引入的子网掩码的概念 3. 在引入子网掩码后&#xff0c;IP 网络号 子网号 主机号 4.子网…

UI设计中的插画运用优势(上)

1. 插画是设计的原创性和艺术性的基础 无论是印刷品、品牌设计还是UI界面&#xff0c;更加风格化的插画能够将不同的风格和创意加入其中&#xff0c;在激烈的竞争中更容易因此脱颖而出。留下用户才有转化。 2. 插画是视觉触发器&#xff0c;瞬间传达大量信息 我们常说「一图胜千…

【ARMv8M Cortex-M33 系列 7.1 -- xPSR | CFSR | HFSR | BFAR | MMFAR 寄存器】

文章目录 问题背景Cortex-M33 Fault 寄存器介绍xPSR (程序状态寄存器)CFSR (可配置故障状态寄存器)HFSR (硬件故障状态寄存器)BFAR (总线故障地址寄存器)MMFAR (内存管理故障地址寄存器) 问题背景 由于在RA4M2&#xff08;Cortex-M33&#xff09;移植RT-Thread OS的时候遇到了…

数据结构和算法笔记4:排序算法-归并排序

归并排序算法完全遵循分治模式。直观上其操作如下&#xff1a; 分解&#xff1a;分解待排序的n个元素的序列成各具n/2个元素的两个子序列。解决&#xff1a;使用归并排序递归地排序两个子序列。合并&#xff1a;合并两个已排序的子序列以产生已排序的答案。 我们直接来看例子…

ubuntu-20.04.6-live-server-amd64安装教程-完整版

简介 Ubuntu 20.04.6 Live Server AMD64 安装教程 - 完整版" 提供了详细的指南&#xff0c;旨在帮助用户在使用 AMD64 架构的服务器上安装 Ubuntu 20.04.6 Live Server 版本。该教程包含全面的步骤和详细说明&#xff0c;使用户能够顺利完成整个安装过程&#xff0c;建立…

力扣70. 爬楼梯(动态规划 Java,C++解法)

Problem: 70. 爬楼梯 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 由于本题目中第i层台阶只能由于第i- 1层台阶和第i-2层台阶走来&#xff0c;所以可以联想到动态规划&#xff0c;具体如下&#xff1a; 1.定义多阶段决策模型&#xff1a;对于每一上台阶看作一种状…

【LGR-172-Div.4】洛谷入门赛 #19(A—H,c++详解!)

文章目录 【LGR-172-Div.4】洛谷入门赛 #19A.分饼干 I题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例解释 1样例解释 2数据范围与约定思路: 代码 B.分饼干 II题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样…

SpringMVC基础知识学习笔记

Universe Infinity Inc. 目录 一、学习SpringMVC主要是学什么1、SpringMVC的基本原理2、SpringMVC学习串联 二、快速体验SpringMVC的开发1、新建项目&#xff0c;转成web项目2、引入依赖3、编写Spring的配置类4、配置web启动类&#xff0c;替代web.xml5、编写Handler&#xff…

助力焊接场景下自动化缺陷检测识别,基于YOLOv3模型开发构建工业焊接场景下缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

令牌桶算法与Guava的实现RateLimiter源码分析

令牌桶算法与Guava的实现RateLimiter源码分析 令牌桶RateLimiter简介RateLimiter使用示例导入maven依赖编写测试代码 RateLimiter的实现源码解析SmoothRateLimiterSmoothBursty恒速获取令牌acquire(int)tryAcquire(int,long,TimeUnit) 存量桶系数小结 优缺点与漏桶的区别总结 令…

01-开始Rust之旅

1. 下载Rust 官方推荐使用 rustup 下载 Rust&#xff0c;这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要连接互联网。 这边提供了离线安装版本。本人学习的机器环境为&#xff1a; ubuntu x86_64&#xff0c;因此选用第②个工具链&#xff1b; 1. rust-1.75.0-x86_…

CloudPanel RCE漏洞复现(CVE-2023-35885)

0x01 产品简介 CloudPanel 是一个基于 Web 的控制面板或管理界面,旨在简化云托管环境的管理。它提供了一个集中式平台,用于管理云基础架构的各个方面,包括虚拟机 (VM)、存储、网络和应用程序。 0x02 漏洞概述 由于2.3.1 之前的 CloudPanel 具有不安全的文件管理器 cook…

【JSON2WEB】01 WEB管理信息系统架构设计

WEB管理信息系统分三层设计&#xff0c;分别为DataBase数据库、REST2SQL后端、JSON2WEB前端&#xff0c;三层都可以单独部署。 1 DataBase数据库 数据库根据需要选型即可&#xff0c;不需要自己设计开发&#xff0c;一般管理信息系统都选关系数据库&#xff0c;比如Oracle、…

beego的模块篇 - I18n国际化

1. i18n 安装导入 安装该模块&#xff1a; go get github.com/beego/i18n 导入引用包&#xff1a; import ("github.com/beego/i18n" ) conf 目录下就有 locale_en-US.ini 和 locale_zh-CN.ini 两个本地化文件。 本地化文件的文件名和后缀是随意的&#xff0c;不…

C++_Lambda表达式的完整介绍

目录 1. 什么是Lambda表达式 1.1 四种表达式的含义 1.2 lambda表达式各个成员的解释 2. 捕获列表 3. 编译器如何看待Lambda表达式 参考文章 参考: C Lambda表达式的完整介绍 - 知乎 c在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数&#xff0c;使得代码…

超过GPT3.5?Mixtral 8*7B 模型结构分析

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 前言 2023年12月11日&#xff0c;Mistral AI团队发布了一款高质量的稀疏专家混合模型Mixtral 8x7B。 Mistral AI继续致力于向开发者社区提供最优秀的开放模型。在人工智能领域向前发展&#xff0c;需要采取超越…

关于SpringBoot项目整合Log4j2实现自定义日志打印失效原因

主要的原因是因为&#xff0c;SpringBoot的logback包的存在&#xff0c;会导致Spring Boot项目优先实现logback的日志设置&#xff0c;所以导致我们用Log4j2实现自定义日志失效。 先找l哪个包引用了logback包 进入之后查询logback 然后双击包 发现是spring-boot-starter-loggin…