es是面向文档的,关系型数据库和es的对比。 一切都是Json!
| Relational DB | ElasticSearch |
|---|---|
| 数据库(database) | 索引(indices) |
| 表(tables) | |
| 行(rows) | 文档(document) |
| 字段(columns) | 字段(fields) |
倒排索引
通过关键字查找id,再通过id去查找内容
ES基础操作创建索引(使用Put请求,具有幂等性)
Put http://localhost:9200/shopping
查询索引(Get)
Get http://localhost:9200/shopping
查看所有索引
Get http://localhost:9200/_cat/indices?v
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lg6J34cz-1634526489384)(C:Usersniko.liAppDataRoamingTyporatypora-user-imagesimage-20210920111213522.png)]
删除索引 (Delete)
Delete http://localhost:9200/shopping
创建文档
Post http://localhost:9200/shopping/_doc(随机ID)
Put http://localhost:9200/shopping/_doc1001(创建指定ID,幂等性)
查询文档
Get http://localhost:9200/shopping/_search(查询全部文档)
Get http://localhost:9200/shopping/_doc/1001(主键查询)
修改文档
完全更新:
Put http://localhost:9200/shopping/_doc/1001
{
"title":"苹果手机"
}
局部更新:
Post http://localhost:9200/shopping/_update/1001
{
"doc":{
"title":"华为手机"
}
}
删除文档
Delete http://localhost:9200/shopping/_doc/1001
ES-JavaAPI
//插入文档
IndexRequest request = new IndexRequest();
request.index("user").id("1001");
User user = new User("niko","20");
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writevalueAsString(user);
request.source(s, XContentType.JSON);
IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
//查询文档
GetRequest request = new GetRequest();
request.index("user").id("1001");
GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
//删除文档
DeleteRequest request = new DeleteRequest();
request.index("user").id("1001");
esClient.delete(request, RequestOptions.DEFAULT);
//关闭客户端
esClient.close();
}
}
ES进阶
索引(Index)
一个索引就是一个拥有几分相似特征的文档的集合
精髓:一切设计都是为了提高搜索的性能
一个文档是一个可被索引的基础信息单元,也就是一条数据
在一个index里面,你可以存储任意多的文档。
文档以JSON格式来表示
字段(Field)相当于数据表的字段,对文档数据根据不同属性进行的分类标识
映射(Mapping)mapping是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等。
分片(Shards)ES可以将索引划分为多份,每一份就称之为分片。
使用分片的原因:
- 允许你水平分割、扩展你的内容容量。
- 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
ES允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)
使用副本的原因:
- 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原分片置于同一节点上是非常重要的。
- 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。
将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。这个过程是由master节点完成的。
路由计算路由计算:hash(id)%主分片数量(3) =【0,1,2】
路由控制:用户可以访问任何一个节点获取数据,这个节点称之为协调节点。
存取数据是根据路由计算得出数据应该存在哪一个节点。
数据写流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ec7VhbOJ-1634526489390)(C:Usersniko.liAppDataRoamingTyporatypora-user-imagesimage-20210927100530783.png)]
- 客户端请求集群节点(任意),-协调节点
- 协调节点将请求转换到指定的节点
- 主分片需要将数据保存
- 主分片需要将数据发送给副本
- 副本保存后,进行反馈
- 主分片进行反馈
- 客户端获取反馈
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QpMa0r0A-1634526489392)(C:Usersniko.liAppDataRoamingTyporatypora-user-imagesimage-20210927101607011.png)]
- 客户端发送查询请求到协调节点
- 协调节点计算数据所在的分片以及全部的副本位置
- 为了能够负载均衡,可以轮询所有节点
- 将请求转发给具体的节点
- 节点返回查询结果,将结果反馈给客户端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EMHcZq04-1634526489394)(C:Usersniko.liAppDataRoamingTyporatypora-user-imagesimage-20210927102019974.png)]
A-1634526489392)]
- 客户端发送查询请求到协调节点
- 协调节点计算数据所在的分片以及全部的副本位置
- 为了能够负载均衡,可以轮询所有节点
- 将请求转发给具体的节点
- 节点返回查询结果,将结果反馈给客户端
[外链图片转存中…(img-EMHcZq04-1634526489394)]



