[知识总结] Elasticsearch学习总结(二)
作者:CC下载站 日期:2021-10-19 03:16:00 浏览:46 分类:编程开发
本博客继续记录博主学习的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
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[书籍] 张九仪《秘传造葬制煞作法》[pdf]
[小说] 武侠小说合集(1912部)
[源码程序] 短剧机器人+付费进群系统,短剧新风口躺赚收益(附源码)
[开发辅助] 开发人员的终极工具箱 | He3(2.0.20.0)
[文件修改] PDF信息修改工具 PDF补丁丁 | PDFPatcher(1.0.1.4234)
[CF探险模式] 地图禁区畅玩攻略,高效获取禁区奖励
[电影] 2024年国产奇幻片《狂暴巨蜥》HD国语中字
[电影] 1984年中国香港经典喜剧片《人吓鬼》蓝光国粤双语中字
[书籍] 席殊实用硬笔字字贴[pdf]
[推荐网站] 钛盘 TMP.link - 不限速无限空间临时分享网盘 (免客户端/支持CURL命令行上传下载)
[资料] [大学期末救急课] 猴博士+高斯课堂+斐多课堂,全集视频合集
[云资源] 价值2万元的老男孩Python教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[云资源] 花了一千多元买的私人健身教程
[下载工具] Internet Download Manager 6.42.7 (IDM)
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[即时通讯] 腾讯QQ PC版9.7.22.29315去广告绿色纯净版
[开发环境] PhpStorm2023中文激活版v2023.3.3 正式版
[图像制作] Adobe Illustrator 2024 v28.1.0.141 破解版
[资料] 3000 套电影电视剧 LOGO 宣传片常用音效合集包
[云资源] 价值2万元的老男孩Python教程
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[云资源] 花了一千多元买的私人健身教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[安卓软件] Android GIF助手 v3.9.7 GIF图片编辑器破解版
[电视剧] 三体 (2024) 全8集 网飞版本 中文字幕 合集
[剧集] 繁花 (2023)[全30集][打包]
[影视] 三大队 WEB-DL版下载/Endless Journey/请转告局长,三大队任务完成了 2023 三大队 6.7G
[纪录片] 河西走廊【10集 国语 中文字幕 1080P 10.8G MP4】
[安卓软件] OfficeSuite中文版APP v14.2.50872.0破解版
- 最新评论
-
谢谢支持!!CC下载站 评论于:03-26 很棒的资源,感谢分享云体风身 评论于:03-26 感谢分享,好东西云体风身 评论于:03-26 谢谢支持!CC下载站 评论于:03-14 央视精品,感谢付出提供。qwer9009 评论于:03-14 谢谢支持!!!CC下载站 评论于:03-13 谢谢分享!Ypc9182 评论于:03-12 谢谢支持!!CC下载站 评论于:03-11 感谢本网站收集和提供这么多的资料,谢谢!Ypc9182 评论于:03-10 很棒的资源,支持一下lingzhi007 评论于:03-10
- 热门tag