ElasticSearch - 基础概念和映射
前言
写这篇东西,是因为官方文档看着太痛苦,于是乎想用大白话来聊聊 ElasticSearc (下面都简称ES)。所以下文对于 ES 一些概念的表述可能会与官方有出入,所以需要准确的表述和详细定义的,请跳转官方文档。我也尽量贴上官方的链接。
前置知识:因为下文会使用 mysql 的一些概念来描述,所以没学过的不建议看文本。
本文基于 ES 8.12
ES 基础概念
ES 是一个搜索引擎。重点是大数据搜索,如果是传统的 CRUD,请考虑关系型数据库。
下面来了解几个 ES 的基础概念
索引(index)
Index modules | Elasticsearch Guide [8.12] | Elastic
类比 mysql 的表,但又与表有很大区别
mysql:创建表需要先定义表字段,再进行数据插入。并且如果添加新字段,需要先修改表结构,再进行数据插入。
ES:索引无需预先定义字段(ES 里面叫映射),可在插入数据时动态添加字段(这叫动态映射,后面讲)
文档类型(type)
ES7 开始,文档类型只有默认的 _doc 了,我没用过旧版,所以略...
文档(document)
类比 mysql 的表的一条数据。
映射(mapping)
Mapping | Elasticsearch Guide [8.12] | Elastic
类比 mysql 的表字段,不同类型的字段,存储和查找会有区别
查看索引的映射
-- 查看映射(索引名为 my-index 的映射)
GET /my-index/_mappings
-- 查看映射的某个字段(索引名为 my-index 的字段 age 的映射)
GET /my-index/_mapping/field/age
动态映射
Dynamic field mapping | Elasticsearch Guide [8.12] | Elastic
ES 与传统关系型数据库不同,创建索引(类比 mysql 的表)时,不需要指定字段,在插入数据时,会自动创建字段和判断字段的类型,这就是动态映射。
动态映射默认的开启的,可以通过 dynamic 参数来修改。dynamic | Elasticsearch Guide [8.12] | Elastic
以下是不同 dynamic 参数对 json 数据类型的映射
| JSON 数据类型 | dynamic: true | dynamic: runtime |
|---|---|---|
| null | No field added | No field added |
| true or false | boolean | boolean |
| double | float | float |
| long | long | long |
| object | object | No field added |
| array | 取决于数组中的第一个非 null 值 | 取决于数组中的第一个非 null 值 |
| 日期类型的 string | date | date |
| 数字类型的 string | float or long | double or long |
| 其他类型的 string | text with a .keyword sub-field | keyword |
注意:默认的数字检测是关闭的,也就是在 没有映射 的情况下,插入 666 字符串是识别的成字符串的。如果已经配置了映射字段是 long 类型,插入 666 字符串才会被识别为数字
日期检测:
默认的日期检测格式有 yyyy/MM/dd HH:mm:ss||yyyy/MM/dd
也就是 2024/01/01 12:00:00 或者 2024/01/01 ,但是 2024-01-01 格式也行, 2024-01-01 12:00:00 不可以
自定义日期检测
PUT my-index
{
"mappings": {
"dynamic_date_formats": [ "yyyy/MM", "MM/dd/yyyy"]
// 或者用
"dynamic_date_formats": [ "yyyy/MM|MM/dd/yyyy"]
}
}
两者的区别在于,[ "yyyy/MM", "MM/dd/yyyy"] 第一次插入数据,匹配到哪种,以后都用这种检测。而 [ "yyyy/MM|MM/dd/yyyy"] 则是两种格式都能用
显式映射
创建索引时添加映射
不需要搜索的字段,建议用 index: false 属性
index | Elasticsearch Guide [8.12] | Elastic
PUT /my-index
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" , "index": false },
"name": { "type": "text" }
}
}
}
向现有映射添加字段
PUT /my-index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}
修改现有映射
除了支持的映射参数外,您不能更改现有字段的映射或字段类型。更改现有字段可能会使已索引的数据无效。
如果需要更改字段的映射,请使用正确的映射创建一个新索引,并将数据重新索引到该索引中。
说人话就是:ES 是用来搜索的,官方不建议修改字段映射。不比关系数据库,ES 更改字段的映射很麻烦,跟重新建一个索引把数据导进去差不多(官方也建议这么玩)
总结
本文用大白话讲了 ES 的几个基本概念和映射的操作,旨在让小白能快速了解 ES,如果文章有错误的地方,欢迎评论区指出。
参考资料
Elasticsearch Mapping类型修改 - 知乎 (zhihu.com)
ElasticSearch - 基础概念和映射的更多相关文章
- 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲
目录 一.导读 二.彩蛋福利:账号借用 三.ES的Index.Shard及扩容机制 四.ES支持的核心数据类型 4.1.数字类型 4.2.日期类型 4.3.boolean类型 4.4.二进制类型 4. ...
- Elasticsearch基础概念理解
熟悉ES中的几个关键概念: 节点(Node):一个elasticsearch运行的实例,其实就是一个java进程.一般情况下,一台机器运行在一台机器上. 集群(Cluster): 好几个有相同集群名称 ...
- elasticsearch基础概念
接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒). 集群(clu ...
- Elasticsearch 基础概念知识
接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒). 集群(cluster) 一个集群就是由一个或多 ...
- Elasticsearch教程之基础概念
基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 1.接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味 ...
- ELK&ElasticSearch5.1基础概念及配置文件详解【转】
1. 配置文件 elasticsearch/elasticsearch.yml 主配置文件 elasticsearch/jvm.options jvm参数配置文件 elasticsearch/log4 ...
- Elasticsearch入门教程(二):Elasticsearch核心概念
原文:Elasticsearch入门教程(二):Elasticsearch核心概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:ht ...
- Elasticsearch 基础介绍
# Elasticsearch简介 ## 基础概念 Elasticsearch由Shay banon在2004年进行初步开发,并且在2010年2月发布第一个版本. 此后Shay banon在2 ...
- 最完整的Elasticsearch 基础教程
翻译:潘飞(tinylambda@gmail.com) 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Ela ...
- 什么是JavaScript闭包终极全解之一——基础概念
本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...
随机推荐
- Adoquery.Refresh 慎用。。。。非常严重,会带来各种问题。
adoquery.refresh 各种问题,根本启不到刷新的作用.完全不刷新的节奏. 修改成已经打印后,如果用adoquery.refresh的话,这两个订单 并不会被刷新掉,惨吧......
- 如何在.NET Core中为gRPC服务设计消息
如何在.NET Core中为gRPC服务设计消息 使用协议缓冲区规范定义gRPC服务非常容易,但从需求转换为.NET Core,然后管理服务的演变时,需要注意几件事. 创建gRPC服务的核心是.pro ...
- ES6学习 第七章 函数的扩展
前言 本章介绍函数的扩展.有些不常用的知识了解即可. 本章原文链接:函数的扩展. 函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面. 当函数形参没有被赋值时,才会将默认值 ...
- Google搜索操作符:让你秒变搜索专家
搜索引擎对互联网的重要性不言而喻,不过,随着ChatGPT及其类似AI工具的推出,对搜索引擎带来了前所未有的挑战. 因为ChatGPT具有自然语言处理能力,能够更好地理解用户的搜索意图,提供更准确.更 ...
- STC8A/STC8H通用的最小系统板
STC8(包括之前的STC15)因为自带晶振, 所以最小电路需要的外围元件几乎为0 -- 手册上画的两个电容不加也没问题, 直接加上5V电源就能跑. 这样只需要用排针把管脚都引出就行了. 唯一不方便的 ...
- Python三次样条插值与MATLAB三次样条插值简单案例
1 三次样条插值 早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿木条画下曲线,成为样条曲线. 设函数S(x)∈C2[a,b] ,且在每个小区间[x ...
- centos7安装mailx
1.安装mailx yum install mailx -y 2.配置证书 mkdir -p /root/.certs echo -n | openssl s_client -connect smtp ...
- 教你如何判断Java代码中异步操作是否完成
本文分享自华为云社区<java代码实现异步返回结果如何判断异步执行完成>,作者: 皮牙子抓饭. 在许多应用程序中,我们经常使用异步操作来提高性能和响应度.在Java中,我们可以使用多线程或 ...
- 临时修改session日期格式冲突问题
输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' alter session set NLS_DATE_LANGUAGE ...
- zlib开发笔记(一):zlib库介绍、编译和工程模板
前言 Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库. zlib库 zlib被设计为一个免费的,通用的,法律上不受限制的-即不受任何专利保护的无损数据压缩库,几乎可 ...