Elasticsearch 开箱指南
内容概要
- ES 基础介绍,重点是其中的核心概念。
- 基础 API 实践操作。
1. 基础介绍
Elasticsearch (ES) 是一个数据库,提供了分布式的、准实时搜索和分析。
基于 Apache Lucene,可以操作结构化数据、非结构化数据、数字类型数据、地理空间数据。
数据存储使用松散结构的 JSON 文档。
主要特性
- 轻量快速的全文搜索。
- 安全分析和基础设施监控。
- 支持海量规模,数千台服务器、PB级数据量。
- 可以集成可视化数据分析工具,用于例如应用性能分析、日志监控、基础设施度量指标监控。
- 可以用于机器学习,对数据实时进行自动化模型处理。
核心概念
- Index 索引
关系数据库中的表,存储文档。
6.0.0 版本之前,一个索引中可以存放不同类型的文档,例如 Car 和 Bike 这2种文档可以在一个索引中。
6.0.0 版本之后,不可以了,需要为每种类型的文档建立不同的索引。
- Documents 文档
关系数据库中的 行。
每个文档有一个唯一 _id。
- Fields 字段
关系数据库中的 列。
- 数据类型
1)字符串
有2种类型:text 和 keyword。
text
用户存储产品描述、文章内容之类的文本,可以根据关键字在其中查找。
ES 会把内容解析成一个字符串列表,然后创建倒排索引,描述每个单词都在哪些文档中出现了。
例如一个文档有一个字段 “Description”,值为 “This phone has dual sim capability”。
这个值会被解析为一个列表:
[“this”, “phone”, “has”, “dual”, “sim”, “capability”]
倒排索引中,会指出每个词所在的文档列表,如:
“this” -> doc_1,doc_3
Keyword
用于存储用户名、邮件地址、邮编这类的明确的内容。
这类内容不会被分割解析,适用于精确匹配。
2)数字
存储例如标识码、百分比、电话号等。
支持:long, integer, short, byte, double, float。
3)日期
形式包括:“2015/01/01 12:10:30” 此类的字符串、微秒级 long 型数字、秒级 integer 型数字。
内部使用 UTC long 型存储。
4)布尔
5)IP
6)嵌入式
一个属性可以是一个 JSON 数组。
例如:
{
"name":"ABC United",
"homeGround":"Old Trafford",
"players":[
{
"firstName":"James",
"lastName":"Cohen",
"position":"Goal Keeper"
},
{
"firstName":"Paul",
"lastName":"Pogba",
"position":"Midfielder"
}
]
}
对于嵌入类型,每个数组对象都会被作为一个隐藏文档进行索引。
7)多类型
例如有一个字段 “student_name”,我们希望可以通过部分匹配的方式进行查找,也希望通过完全匹配的方式查找。
这就相当于同时有2种类型:text和 keyword。
可以这样设置:
{
"student_name":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword"
}
}
}
}
- Mapping
用于定义一个索引的 schema。
定义索引中有哪些字段、字段类型,配置类型相关的元数据。
- Setting
通过 Setting 可以自定义一些索引的行为,还允许我们自定义分析器和标准化器,以分析索引的不同文本字段。
重要的 Setting 例如:
1)number_of_shards:定义索引分片数量,默认为 1。
2)number_of_replicas:定义分片的副本数量,默认 1。
3)refresh_interval:用于指定文档索引的时间与可供搜索的时间之间的间隔,默认 1秒。
- Shard 分片
一个分片是一个 Lucene 实例,是一个被 ES 自动管理的工作单元。
我们只需要指定分片及其副本的数量,无需对分片进行操作。
ES 自动在所有节点中分布所有分片,当节点故障时,会把分片移到其他节点,当有新节点添加进来时,也会自动把一些分片移过来。
- Replicas 副本
主分片的拷贝,副本的作用:
1)当主分片故障后,其副本可以提升为主分片。
2)主分片及其副本都可以处理查询请求,可以提升性能。
- Aliases 别名
用于指定索引或索引集的替代名称。
当我们想从多个索引中获取文档时非常有用。
- Template 模板
用户对多个索引指定通用的 mapping 和 Setting。
每当创建与模板中定义的特定模式匹配的新索引时,模板将应用于该索引。
创建索引时特别定义的任何 mapping/Setting 都将优先于模板中的定义。
2. API 操作
测试环境搭建
使用的 ES 版本为 7.5.1。
下面使用docker启动一个单节点环境:
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.5.1
测试:
$ curl -X GET "localhost:9200/_cat/nodes?v&pretty"
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.17.0.2 7 97 2 0.96 0.61 0.25 dilm * 245e340eba97
$ curl localhost:9200
{
"name" : "245e340eba97",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "mq_bxY5zTjCpmJU0xOLSbA",
"version" : {
"number" : "7.5.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
"build_date" : "2019-12-16T22:57:37.835892Z",
"build_snapshot" : false,
"lucene_version" : "8.3.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
参考文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html
实践操作
- 创建索引
curl -X PUT "localhost:9200/traveler?pretty" -H 'Content-Type: application/json' -d'
{
"settings":{
"number_of_shards":5,
"number_of_replicas":2
},
"mappings":{
"properties":{
"name":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"background":{
"type":"text"
},
"nationality":{
"type":"keyword"
}
}
}
}
'
- 插入文档
curl -X PUT "localhost:9200/traveler/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name":"John Doe",
"age":"23",
"background":"Born and brought up in California. Engineer by profession. Loves to cook",
"nationality":"British"
}
'
- 读取文档
curl -X GET "localhost:9200/traveler/_doc/1?pretty"
- 删除文档
curl -X DELETE "localhost:9200/traveler/_doc/1?pretty"
- 删除索引
curl -X DELETE "localhost:9200/traveler?pretty"
- 所有索引列表
curl -X GET "localhost:9200/_cat/indices"
- 查看集群健康情况
curl -X GET "localhost:9200/_cat/health?v"
- 查看某个索引的信息
# mapping + setting
curl -X GET "localhost:9200/traveler?pretty"
# mapping
curl -X GET "localhost:9200/traveler/_mapping?pretty"
# setting
curl -X GET "localhost:9200/traveler/_settings?pretty"
- 为索引设置别名
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions":[
{
"add":{
"index":"traveler",
"alias":"read_alias"
}
}
]
}
'
- 获取索引中的所有文档
curl -X GET "localhost:9200/traveler/_search?pretty"
结果中的关键项:
took - 此次查询耗时,毫秒。
timed_out - 查询是否超时。
_shards - 查询了分片的情况,如一共查询了几个分片、成功了几个。
hits - 查询结果。
hits.total - 结果文档数。
hits.hits - 结果数组,默认只显示前10个文档。
hits.max_score - 匹配度最高的文档的分值。
hits.hits._score - 此文档匹配度分值。
- 获取所有中的文档总数
curl -X GET "localhost:9200/traveler/_count?pretty"
- 匹配查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"match":{
"background":"brought up California Loves cook"
}
}
}
'
匹配条件是 "background",其值会被处理为数组:[“brought”, “up”, “california”, “loves”, “cook”]。
只要其中的某一个与文档中的 "background" 值相匹配,文档就会被返回。
- term 查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"term":{
"name":{
"value":"John Doe"
}
}
}
}
'
这用于获取在提供的字段中包含确切术语的文档。
适用于 keyword, numeric, date, boolean 类型的字段。
- terms 查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"terms":{
"name":[
"John Doe",
"Jack Ripper",
"Buzz Aldrin"
]
}
}
}
'
类似 IN 查询,匹配一个或多个。
- 前缀匹配查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"prefix":{
"name":"Joh"
}
}
}
'
- 正则查询
curl -X GET "localhost:9200/traveler/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"regexp":{
"name":{
"value":"J.*e"
}
}
}
}
'
- 单次多查询
在一个请求中执行多个查询操作。
curl -X GET "localhost:9200/_msearch?pretty" -H 'Content-Type: application/x-ndjson' -d'
{"index":"traveler"}
{"query":{"terms":{"name":["John Doe","Jack Ripper","Barack Obama"]}}}
{}
{"query":{"prefix":{"name":"Buzz"}}}
{"index":"traveler"}
{"query":{"match_all":{}}}
'
推荐阅读:
Elasticsearch 开箱指南的更多相关文章
- Elasticsearch 权威指南
Elasticsearch 权威指南 http://fuxiaopang.gitbooks.io/learnelasticsearch/content/index.html
- Elasticsearch 权威指南 NESTAPI地址
Elasticsearch 权威指南:http://fuxiaopang.gitbooks.io/learnelasticsearch/content/index.html NEST:http://n ...
- 史上最全面的Elasticsearch使用指南
Elasticsearch使用指南 Elasticsearch使用指南 前言 ES是什么 什么是全文检索 ES的应用场景 ES的存储结构 第一章:安装 1.下载 2.解压 3.配置 4.启动 5.查看 ...
- elasticsearch权威指南
elasticsearch权威指南 https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/
- Elasticsearch: 权威指南(官方教程)
<Elasticsearch 权威指南>中文版 序言 前言 基础入门 深入搜索 处理人类语言 聚合 地理位置 数据建模 管理.监控和部署
- 初识Elastic search—附《Elasticsearch权威指南—官方guide的译文》
本文作为Elastic search系列的开篇之作,简要介绍其简要历史.安装及基本概念和核心模块. 简史 Elastic search基于Lucene(信息检索引擎,ES里一个index—索引,一个索 ...
- Elasticsearch权威指南(中文版)
Elasticsearch权威指南(中文版) 下载地址: https://pan.baidu.com/s/1bUGJmwS2Gp0B32xUyXxCIw 扫码下面二维码关注公众号回复100010 获取 ...
- elasticsearch 权威指南入门阅读笔记(一)
相关文档 esapi:https://es.xiaoleilu.com/010_Intro/10_Installing_ES.html https://esdoc.bbossgroups.co ...
- Spring Data Elasticsearch 用户指南
https://www.jianshu.com/p/27e1d583aafb 翻译自官方文档英文版,有删减. BioMed Central Development Team version 2.1.3 ...
随机推荐
- linux 位操作
atomic_t 类型在进行整数算术时是不错的. 但是, 它无法工作的好, 当你需要以原子方 式操作单个位时. 为此, 内核提供了一套函数来原子地修改或测试单个位. 因为整个操作 在单步内发生, 没有 ...
- oracle 包 简单使用
理解PL/SQL包 简介 包(package)的主要作用是用于逻辑组合相关的PL/SQL类型 比如记录类型或者集合类型,PL/SQL游标或游标声明以及PL/SQL子程序 还可以包含任何可以在块的声明区 ...
- 使用 Postman 测试你的 API
使用 Postman 测试你的 API Intro 最近想对 API 做一些自动化测试,看了几个工具,最后选择了 postman,感觉 postman 的设计更好一些,我们可以在请求发送之前和请求获取 ...
- $tarjan$简要学习笔记
$QwQ$因为$gql$的$tarjan$一直很差所以一直想着要写个学习笔记,,,咕了$inf$天之后终于还是写了嘻嘻. 首先说下几个重要数组的基本定义. $dfn$太简单了不说$QwQ$ 但是因为有 ...
- 洛谷$ P$4317 花神的数论题 数位$dp$
正解:数位$dp$ 解题报告: 传送门! 开始看到感觉有些新奇鸭,仔细一想发现还是个板子鸭,,, 考虑设$f_{i}$表示$sum[j]=i$的$j$的个数 日常考虑$dfs$呗,考虑变量要设哪些$Q ...
- Spring Security详解
Spring Security 一. 简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文 ...
- 公子奇带你进入Java8流的世界(一)
在说流之前,我们先来看看集合,为什么呢?作为Java8中的新成员,它和集合有很多相似之处,同时它们也是可以互相转化的.集合不仅仅是Java语言,任何一门高级开发语言都有集合的概念,集合顾名思义,就是很 ...
- js中getBoundingClientrRect()方法的详解
getBoundingClientRect(): 这个方法返回一个矩形对象,包含四个属性:left.top.right和buttom.分别表示元素各边与页面各边的距离 例如: var boxPosit ...
- linux入门基础指令大全(汇总)
一.文件目录指令 1 pwd指令 pwd 显示当前所在的目录 2 ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 ll ...
- 用积分方法求K次方和数列公式
这是我很早以前在高中时发现的一个通用计算K次方和数列公式的方法,很特别的地方是用了微积分中的积分方法.目前我还没有发现有谁提出和我一样的方法,如果哪位读者有相关发现,麻烦告知我. 大家很多人都知道高斯 ...