一、ElasticSearch简介
1、 Elasticsearch
Elasticsearch是一个基于Apache Lucene™的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。特点:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎–做不规则查询
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
2 、ES能做什么?
全文检索(全部字段)、模糊查询(搜索)、数据分析(提供分析语法,例如聚合)
3、 基本概念
1、Index(索引)
动词,相当于 MySQL 中的 insert;
名词,相当于 MySQL 中的 Database
2、Type(类型)
在 Index(索引)中,可以定义一个或多个类型。
类似于 MySQL 中的 Table;每一种类型的数据放在一起;
3、Document(文档)
保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格
式的,Document 就像是 MySQL 中的某个 Table 里面的内容;
二、安装
1、教程
地址☞:一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
三、初步检索
1、_cat
GET /_cat/nodes:查看所有节点
GET /_cat/health:查看 es 健康状况
GET /_cat/master:查看主节点
GET /_cat/indices:查看所有索引 show databases;
测试案例
GET /_cat/nodes
:查看所有节点
GET /_cat/health
:查看 es 健康状况
GET /_cat/master
:查看主节点
GET /_cat/indices
:查看所有索引 show databases;
2、索引一个文档(保存)
保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识。PUT customer/external/3
: 在 customer 索引下的external 类型下保存 3号数据为
{
"name":"zhang san"
}
提示:
PUT 和 POST 都可以,
POST 新增。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号
PUT 可以新增可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改操作,不指定 id 会报错。
3、查询文档
GET customer/external/3
查询结果
字段解释:
{
"_index": "customer", //在哪个索引
"_type": "external", //在哪个类型
"_id": "3", //记录 id
"_version": 4, //版本号
"_seq_no": 14, //并发控制字段,每次更新就会+1,用来做乐观锁
"_primary_term": 24, //同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": { //真正的内容
"name": "zhang san"
}
}
4、更新文档
POST customer/external/3
{
"name":"Li si"
}
或者 POST customer/external/3/_update
{
"doc":{
"name":"hello postman"
}
}
或者 PUT customer/external/3
{
"name":"Wang mazi"
}
使用POST customer/external/3
使用POST customer/external/3/_update
使用 PUT customer/external/3
提示:不同点对比
POST
操作会对比源文档数据,如果相同不会有什么操作,文档 version 不增加;PUT
操作总会将数据重新保存并增加 version 版本;带_update 对比元数据如果一样就不进行任何操作。看场景;对于大并发更新,不带 update;对于大并发查询偶尔更新,带 update;对比更新,重新计算分配规则。
更新同时增加属性
PUT 和 POST 不带_update 也可以
POST customer/external/3/_update
{
"doc": { "name": "Jane Doe", "age": 20 }
}
5、删除文档&索引
5.1 删除文档
//删除文档
DELETE customer/external/3
删除后查询、查询不到相关数据
5.2 删除索引
//删除索引
DELETE customer
连续删除同一个索引、第二次删除会报错索引不存在。
6、bulk 批量 API
使用kibana工具
POST /customer/external/_bulk
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
语法格式
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
测试 POST /customer/external/_bulk
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123"} }
{ "doc" : {"title" : "My updated blog post"} }
提示:
bulk API 以此按顺序执行所有的 action(动作)。如果一个单个的动作因任何原因而失败,它将继续处理它后面剩余的动作。当 bulk API 返回时,它将提供每个动作的状态(与发送的顺序相同
),所以您可以检查是否一个指定的动作是不是失败了
7、样本测试数据
准备了一份顾客银行账户信息的虚构的 JSON 文档样本。每个文档都有下列的 schema(模式)
{
"account_number": 0,
"balance": 16623,
"firstname": "Bradshaw",
"lastname": "Mckenzie",
"age": 29,
"gender": "F",
"address": "244 Columbus Place",
"employer": "Euron",
"email": "bradshawmckenzie@euron.com",
"city": "Hobucken",
"state": "CO"
}
数据地址:https://github.com/elastic/elasticsearch/blob/7.5/docs/src/test/resources/accounts.json