[知识总结] Elasticsearch学习总结(二)
作者:CC下载站 日期:2021-10-19 03:16:00 浏览:61 分类:编程开发
本博客继续记录博主学习的Elasticsearch的总结,对于(一)编程不良人的已更换,那篇博客算是废弃了,这篇博客从新开始学习。
介绍
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎:
- 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
- 实时分析的分布式搜索引擎
- 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据
与MySQL术语对比
与MySQL索引对比
Elasticsearch使用的倒排索引比关系型数据库的B-Tree索引快
B-Tree索引
二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。
因此在这个基础上,再结合磁盘的读取特性(顺序读/随机读),传统关系型数据库采用了B-Tree/B+Tree这样的数据结构
为了提高查询的效率,减少磁盘寻道次数,将多个值作为一个数组通过连续区间存放,一次寻道读取多个数据,同时也降低树的高度。
倒排索引
倒排索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。
由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。
原doc:
ID是Elasticsearch自建的文档id,那么Elasticsearch建立的索引如下:
es为每一个字段(field/term
)(在倒排索引中所有 term
的合起来称 term dictionary
)都建立了一个倒排索引(posting list
,其实这个翻译过来叫倒排表,但我觉得可以直接理解为倒排索引)(这里之所以为list表,是因为可以有多个值,且有序,为了方便压缩为bitmap
)
首先会通过term index
(一个索引页,可以理解term index
是一颗树,包含的是term
的一些前缀)可以快速定位到term dictionary
的某个offset
(偏移量),然后从这个位置再往后顺序查找找到对应的term
,进而找到它的倒排索引(表)posting list
再根据倒排索引posting list
即可定位到具体的文档内容doc
(总体查找思路有些类似于mysql中的二级索引)
term index
不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary
的block
之间的映射关系,再结合FST(Finite State Transducers)
的压缩技术,可以使term index
缓存到内存中。
从term index
查到对应的term dictionary
的block
位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。
以上是是单field
索引,如果多个field索引的联合查询,倒排索引是利用跳表(Skip list
)的数据结构快速查询的。
ES索引思路
将磁盘里的东西尽量搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种奇技淫巧的压缩算法,用及其苛刻的态度使用内存。
对于使用Elasticsearch进行索引时需要注意:
- 不需要索引的字段,一定要明确定义出来,因为默认是自动建索引的
- 同样的道理,对于String类型的字段,不需要analysis的也需要明确定义出来,因为默认也是会analysis的
- 选择有规律的ID很重要,随机性太大的ID(比如java的UUID)不利于查询
安装
这次依然使用docker,以7.14.2为例
docker hub上elasticsearch已经弃用缺省的标签latest,请加上版本,否则不是最新是老的
elasticsearch
vim /etc/sysctl.conf
# 加入如下两个配置:
# vm.max_map_count=262144
# net.ipv4.ip_forward=1
# 启用配置
sysctl -p
systemctl restart network
# 拉取
docker pull elasticsearch:7.14.2
# 创建es网桥
docker network create esnetwork
# 启动
docker run -d --name es --net esnetwork -p 9200:9200 -p 9300:9300 -v esdata:/usr/share/elasticsearch/data -v esplugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" elasticsearch:7.14.2
kibana
这是个ElasicSearch数据可视化的工具,看需求安装
docker pull kibana:7.14.2
docker run -d -p 5601:5601 --link es:elasticsearch --name kibana --net esnetwork kibana:7.14.2
使用
直接通过http请求
因为ElasticSearch提供了许多restful接口来操作数据,所以我们可以直接使用类似postman的工具来访问数据(假设ip地址为localhost):
# 创建shopping索引
PUT http://locahost:9200/shopping
# 查询索引情况
GET http://locahost:9200/shopping
GET http://locahost:9200/_cat/indices?v
# 查询数据ID为2001
GET http://locahost:9200/shopping/_search/2001
# 多条件查询
GET http://locahost:9200/shopping/_search
Body :
{
"query" : {
"bool" : {
"must" : [
{
"match" : {
"title" : "小米"
}
}
],
"filter" : {
"range" : {
"price" : {
"gt" : 3900
}
}
}
}
},
"highlight" : {
"fields" : {
"title" : {}
}
}
}
具体的操作还有好多,可以直接根据需求翻阅使用文档
SpringBoot整合
依赖:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.14.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.14.2</version>
</dependency>
使用:
索引操作:
public void indexOperation throws Exception{
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200, "http"))
);
//创建索引
// CreateIndexRequest request = new CreateIndexRequest("user");
// CreateIndexResponse createIndexResponse =
// esClient.indices().create(request, RequestOptions.DEFAULT);
//响应状态
// boolean acknowledged = createIndexResponse.isAcknowledged();
// System.out.println(acknowledged);
//查询索引
GetIndexRequest request = new GetIndexRequest("user");
GetIndexResponse getIndexResponse =
esClient.indices().get(request, RequestOptions.DEFAULT);
System.out.println(getIndexResponse.getAliases());
System.out.println(getIndexResponse.getMappings());
System.out.println(getIndexResponse.getSettings());
//关闭
esClient.close();
}
数据的增删改查:
public class ES_DOC {
public static void main(String[] args) throws Exception {
get();
}
public static void insert() throws Exception{
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200, "http"))
);
//插入数据
User user = new User();
user.setAge(20);
user.setName("Peter");
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(user);
IndexRequest request = new IndexRequest();
request.index("user").id("2001");
request.source(user, XContentType.JSON);
IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.getResult());
//关闭
esClient.close();
}
public static void update() throws Exception{
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200, "http"))
);
//更新
UpdateRequest request = new UpdateRequest();
request.index("user").id("2001");
request.doc(XContentType.JSON, "name", "Parker");
UpdateResponse update = esClient.update(request, RequestOptions.DEFAULT);
System.out.println(update.getResult());
//关闭
esClient.close();
}
public static void get() throws Exception{
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200, "http"))
);
//查询
GetRequest request = new GetRequest();
request.index("user").id("2001");
GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
//关闭
esClient.close();
}
public static void delete() throws Exception{
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200, "http"))
);
//删除
DeleteRequest request = new DeleteRequest();
request.index("user").id("1001");
DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
//关闭
esClient.close();
}
}
可以看出ElasticSearch提供了许多的Request来帮助我们读写数据,跟多的查询操作还有其他的Request,可以根据需求翻阅使用文档
猜你还喜欢
- 03-29 [编程相关] Winform窗体圆角以及描边完美解决方案
- 03-29 [前端问题] has been blocked by CORS policy跨域问题解决
- 03-29 [编程相关] GitHub Actions 入门教程
- 03-29 [编程探讨] CSS Grid 网格布局教程
- 10-12 [编程相关] python实现文件夹所有文件编码从GBK转为UTF8
- 10-11 [编程算法] opencv之霍夫变换:圆
- 10-11 [编程算法] OpenCV Camshift算法+目标跟踪源码
- 10-11 [Python] python 创建 Telnet 客户端
- 10-11 [编程相关] Python 基于 Yolov8 + CPU 实现物体检测
- 03-15 [脚本工具] 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏
- 01-08 [编程技术] 秒杀面试官系列 - Redis zset底层是怎么实现的
- 01-05 [编程技术] 《Redis设计与实现》pdf
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[资料] 2025军队文职 公共课+专业课+真题+押题+面试【合集】
[课程] 《大师级航拍教程》63节课程视频 MP4格式 5.9G
[资料] 中医鬼才倪海厦全集完整版+资料全集
[课程] 聂佳判断推理绝版课程大集合【8G】
[电视剧] 芈月传 【全集81集全】【未删减版】【国语中字】【2015】【HD720P】【75G】
[电视剧] 封神榜 梁丽版 (1989) 共5集 480P国语无字 最贴近原著的一版【0.98 G】
[影视] 【雪山飞孤4个版本】【1985、1991、1999、2007】【1080P、720P】【中文字幕】【167.1G】
[资料] 24秋初中改版教材全集(全版本)[PDF]
[电影] 高分国剧《康熙王朝》(2001)4K 2160P 国语中字 全46集 78.2G
[动画] 迪士尼系列动画139部 国英双语音轨 【蓝光珍藏版440GB】
[书籍] 彭子益医书合集 [PDF/DOC]
[游戏] 《黑神话悟空》免安装学习版【全dlc整合完整版】+Steam游戏解锁+游戏修改工具!
[动画] 《名侦探柯南》名侦探柯南百万美元的五菱星 [TC] [MP4]
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[游戏] 黑神话悟空离线完整版+修改器
[电影] 《变形金刚系列》七部合集 [4K HDR 蓝光] 国英双语音轨 [内封精品特效字幕]【典藏版】235G
[图像处理] 光影魔术手v4.6.0.578绿色版
[动画] 西游记 (1999) 动画版 4K 全52集 高清修复版 童年回忆
[影视] 美国内战 4K蓝光原盘下载+高清MKV版/内战/帝国浩劫:美国内战(台)/美帝崩裂(港) 2024 Civil War 63.86G
[影视] 一命 3D 蓝光高清MKV版/切腹 / 切腹:武士之死 / Hara-Kiri: Death of a Samurai / Ichimei 2011 一命 13.6G
[影视] 爱情我你他 蓝光原盘下载+高清MKV版/你、我、他她他 2005 Me and You and Everyone We Know 23.2G
[影视] 穿越美国 蓝光原盘下载+高清MKV版/窈窕老爸 / 寻找他妈…的故事 2005 Transamerica 20.8G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[书籍] 彭子益医书合集 [PDF/DOC]
[资源] 精整2023年知识星球付费文合集136篇【PDF格式】
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
- 最新评论
-
找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢285552528 评论于:11-09 找了好久的资源bjzchzch12 评论于:11-07 谢谢分享感谢ppy2016 评论于:11-05 谢谢分享感谢ppy2016 评论于:11-05 怎么没有后续闲仙麟 评论于:11-03 怎么没后续闲仙麟 评论于:11-03 有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26
- 热门tag