说明:本文内容基于elasticsearch7.15.1版本进行操作
1什么是elasticsearch
Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。
Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源还是私有,但它也仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene 非常复杂。
为了解决Lucene使用时的繁复性,于是Elasticsearch便应运而生。它使用 Java 编写,内部采用 Lucene 做索引与搜索,但是它的目标是使全文检索变得更简单,简单来说,就是对Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。
当然,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确地形容:
一个分布式的实时文档存储,每个字段可以被索引与搜索;
一个分布式实时分析搜索引擎;
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
由于Elasticsearch的功能强大和使用简单,维基百科、卫报、Stack Overflow、GitHub等都纷纷采用它来做搜索。现在,Elasticsearch已成为全文搜索领域的主流软件之一。
2 Elasticsearch基本概念
全文搜索(Full-text Search)
全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
在全文搜索的世界中,存在着几个庞大的帝国,也就是主流工具,主要有:
Apache Lucene
Elasticsearch
Solr
Ferret
2.1 节点 & 集群(Node & Cluster)
Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个Elasticsearch实例。单个Elasticsearch实例称为一个节点(Node),一组节点构成一个集群(Cluster)。
2.2 分片和副本(shard & replica)
⼀个索引可以存储超出单个结点硬件限制的⼤量数据。⽐如,⼀个具有10亿⽂档的索引占据1TB的磁盘 空间,⽽任⼀节点都没有这样⼤的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问 题,Elasticsearch提供了将索引划分成多份的能⼒,这些份就叫做分⽚。当你创建⼀个索引的时候,你 可以指定你想要的分⽚的数量。每个分⽚本身也是⼀个功能完善并且独⽴的“索引”,这个“索引”可以被 放置到集群中的任何节点上。
分片很重要,主要有两⽅⾯的原因:
1)允许你⽔平分割/扩展你的内容容 量。
2)允许你在分⽚(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提⾼性能/吞吐量。
2.3 索引(Index)
Elasticsearch 数据管理的顶层单位就叫做 Index(索引),相当于关系型数据库里的数据库的概念。另外,每个Index的名字必须是小写。
2.4 类型(type)
在⼀个索引中,你可以定义⼀种或多种类型。⼀个类型是你的索引的⼀个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有⼀组共同字段的⽂档定义⼀个类型。 类似数据库表 在7.0之后,类型只有⼀种 _doc。
2.5文档(Document)
Index里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。类似于数据库中的每条数据。
2.6 文档元数据(Document metadata)
文档元数据为_index, _type, _id, 这三者可以唯一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的唯一标识。
2.7 字段(Fields)
每个Document都类似一个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个 Document,可以类比关系型数据库数据表中的字段。
在 Elasticsearch 中,文档(Document)归属于一种类型(Type),而这些类型存在于索引(Index)中,下图展示了Elasticsearch与传统关系型数据库的类比:
3 操作
Elasticsearch提供了多种交互使用方式,包括Java API和RESTful API ,本文主要介绍RESTful API 。所有其他语言可以使用RESTful API 通过端口 9200 和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch 。甚至,你还可以使用 curl 命令来和 Elasticsearch 交互。
一个Elasticsearch请求和任何 HTTP 请求一样,都由若干相同的部件组成:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
返回的数据格式为JSON,因为Elasticsearch中的文档以JSON格式储存。其中,被 < > 标记的部件:
部件 | 说明 |
---|---|
VERB | 适当的 HTTP 方法 或 谓词 : GET、 POST、 PUT、 HEAD 或者 DELETE。 |
PROTOCOL | http 或者 https(如果你在 Elasticsearch 前面有一个 https 代理) |
HOST | Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 |
PORT | 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。 |
PATH | API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。 |
QUERY_STRING | 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读) |
BODY | 一个 JSON 格式的请求体 (如果请求需要的话) |
对于HTTP方法,它们的具体作用为:
HTTP方法 | 说明 |
---|---|
GET | 获取请求对象的当前状态 |
POST | 改变对象的当前状态 |
PUT | 创建一个对象 |
DELETE | 销毁对象 |
HEAD | 请求获取对象的基础信息 |
说明:以下内容实用elasticsearch-head操作内容见截图(es版本为7.15.1)
3.1创建索引
索引名称app_user
索引内容 用户包含的内容有:
主键id,姓名user_name,身份证号码id_card,性别sex,职业occupation
创建索引
{
"settings":{
"number_of_shards":5,
"index.refresh_interval": "5s"
},
"mappings":{
"properties":{
"id":{
"type":"keyword"
},
"user_name":{
"type":"text"
},
"id_card":{
"type":"text"
},
"sex":{
"type":"keyword"
},
"occupation":{
"type":"keyword"
}
}
}
}
显示创建成功,查看创建的索引
3.2 插入文档
当需要设置数据id的时候我们需要在数据中传入需要设置的id
首先查询索引为空
{
"id": "001",
"user_name": "花胡子",
"id_card": "001",
"sex": "男",
"occupation": "dba"
}
当需要设置数据id的时候我们需要在数据中传入需要设置的id如下图所示:
app_user/_doc/001
当不需要id时候可以不写让他自动生成
app_user/_doc
3.3查看插入结果
3.4 修改数据
修改字段数据:一是通过PUT 直接覆盖,二是通过POST /app_user/_update/001 修改
请求url:http://111.11.11.111:9200/es的index/es的type(_doc)/要修改文档的ID/_update/
也可以进行复杂查询更新 类似
POST app_user/_update_by_query
{
"script": {
"source": "ctx._source['ipsub']=0"
},
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "ipsub"
}
}
]
}
}
}
3.5 删除数据
delete app_user/_doc/001
3.6 删除索引
delete app_user
这里做简单介绍,后续文章进行详细操作介绍。