Elasticsearch 别管原理,先run起来
少点代码,多点头发
本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。
https://github.com/midou-tech/articles
看文章有两点需要注意:
本公号讲解的Elasticsearch是基于7.7.0版本,你们在阅读一些相关书籍和博客注意版本,不同版本很多概念会有出入。
文章写作过程中会经常将Elasticsearch简写为Es,阅读过程中需要注意。
一般学习一个新的技术或者产品,第一步就是用起来。什么设计理论,框架源码,都别和我谈,先run起来。这也是在公司看别人项目的绝招。
用起来,有一个很明显的点,是你能感受到他,不然天天看理论知识,看源码会让你觉得你好像懂了,但又心里没底,最终会导致你走火入魔。
今天龙叔的主题就是 学Es,先run起来,用起来之后在去探索内部更多问题和原理。
Elasticsearch安装
Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elasticsearch 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
Elasticsearch 需要 Java 8 环境。如果你的机器还没安装 Java,可以在网上找个教程安装,注意要保证环境变量JAVA_HOME
正确设置。
安装完 Java,就可以跟着 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html 安装 Elasticsearch。我这里就直接下载压缩包比较简单。
#mac和linux上安装教程一样的
# 下载
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512
$ shasum -a 512 -c elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512
#解压
$ tar -xzf elasticsearch-7.7.0-darwin-x86_64.tar.gz
$ cd elasticsearch-7.7.0/
接着,进入解压后的目录,运行下面的命令,启动 Elasticsearch。
$ ./bin/elasticsearch
如果一切正常,那可能是run起来了,Es默认打开9200端口。测试下是否启动成功,用 curl 工具测试(这个工具后面会写一篇文章介绍,还有上面用的wget),也可以在浏览器访问。
$ curl localhost:9200 #测试命令
{
"name" : "MacBook-Pro.local",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "Z1NxCjE4T6CgTjZmpAVe_A",
"version" : {
"number" : "7.7.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
"build_date" : "2020-05-12T02:01:37.602180Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
请求9200端口,Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息。
收到这样一个JSON对象,说明启动成功。
安装整体没什么压力,java环境装好,基本就是开箱即用。程序员最喜欢使用这样的中间件,开箱即用,从不管箱子里面是啥。
基本概念
本来run起来就准备说搞点数据进去,在和Es进行交互起来,但是正在准备写数据进索引的时候,发现不对劲。
可能有人根本不知道什么是索引?什么Document。于是 就来了,先普及下基本概念。
节点(Node) 与集群( Cluster)
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
索引(Index)
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index),也经常称之为倒排索引。查找数据的时候,直接查找该索引。
Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
文档(Document)
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
写点数据进Es
基本概念已经有了,知道查找是通过倒排索引进行的,所以数据肯定是存放在索引里面的。
我们现在要写数据进Es,其实就是把数据写到Es的索引(index)中,前面已经把Es启动起来了,并没有创建索引。
今天写数据就不写代码了,利用ES的一些封装很好的接口,直接命令行操作,后期在用代码写数据进Es。
先创建一个index ,使用curl 工具在命令行操作,这是一个put请求。
$curl -X PUT 'localhost:9200/user'
查看索引是否以及创建成功
$ curl -X GET 'http://localhost:9200/_cat/indices?v'
这个get请求可以查看当前节点的所有索引
妥妥的已经创建成功
顺便说下,删除一个索引的命令,DELETE参数表示删除
$curl -X DELETE 'localhost:9200/user'
到这里索引已经创建好了,可以写点数据进去了。使用接口 /index/_doc/id ,/索引名/_doc/doc_id
$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/1' -d '
{
"name": "龙跃十二",
"title": "工程师",
"desc": "一个分享互联网技术和心路历程的star"
}'
查看当前索引下的所有数据
$ curl 'localhost:9200/user/_search?pretty=true
到这里基本我们已经可以写数据到指定索引了,生产场景不会这么写数据的,都是用代码写海量数据进ES的,这就几条数据也没什么搜索性能可谈的。
我之前工作中日志数据都是TB级别的写到Es中,当遇到这种数据量的搜索时才会感受到搜索引擎的魅力,才会意识到Es的重要性。
这里主要是练手和跑通流程,所以造了一些数据到Es中
和ES进行交互
其实写数据进Es已经是一种交互了,在讲一些其他的交互接口
目前讲的交互方式主要是通过原生的请求的方式,还没有上升到界面操作,后期在学习的过程中会展现出来。
查询交互
使用 GET 方法,直接请求/Index/_search
,就会返回所有记录。
$ curl 'localhost:9200/user/_search?pretty=true'
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "龙跃十二",
"title" : "工程师",
"desc" : "一个分享互联网技术和心路历程的star"
}
},
{
"_index" : "user",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "三y",
"title" : "工程师",
"desc" : "只有光头才能变得更强"
}
},
{
"_index" : "user",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "敖丙",
"title" : "工程师",
"desc" : "一个互联网苟且偷生的工具人"
}
}
]
}
}
上面代码中,返回结果的 took
字段表示该操作的耗时(单位为毫秒),timed_out
字段表示是否超时,hits
字段表示命中的记录,里面子字段的含义如下。
total:返回记录数,本例是2条。 max_scor:最高的匹配程度,本例是1.0。 hits:返回的记录组成的数组。
返回的记录中,每条记录都有一个_score
字段,表示匹配的程序,默认是按照这个字段降序排列。
Es的查询语法还有很多,后面在结合实战项目的时候会讲解其他语法,你也可以看下官网语法介绍 官网查询语法。
数据操作交互
新增一条doc记录的语法示例如下,可以不用指定doc_id的,Es会默认有一个doc_id。
$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
{
"name": "敖丙",
"title": "工程师",
"desc": "一个互联网苟且偷生的工具人"
}'
删除一条doc记录的语法是 /Index/_doc/doc_id
$ curl -X DELETE 'localhost:9200/user/_doc/1'
更新一条记录的语法示例
$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
{
"name": "三太子敖丙",
"title": "工程师",
"desc": "一个互联网苟且偷生的工具人"
}'
总结一下
本篇文章,我们把Es从官网下载下来,可以run起来,可以写数据进去,可以查询,学习了一些简单的交互语法。
当然Es的魅力不在于此,Es的魅力之一在于可以对海量数据进行高效的检索。
下篇文章出一个关于Es的写作大纲,方便大家在看的过程中有一个整理的轮廓。
Es整个知识点我也是边学边写,有什么不对的地方,还希望大佬们尽管指出来。
Elasticsearch 别管原理,先run起来的更多相关文章
- 【分布式搜索引擎】Elasticsearch分布式架构原理
一.相关概念介绍 1)集群(cluster) 一个集群(cluster)由一个或多个节点组成. 这些节点具有相同的cluster.name,它们协同工作,分享数据和负载.当加入新的节点或者删除一个节点 ...
- Elasticsearch安装、原理学习总结
ElasticSearch ElasticSearch概念 Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎. 什么是Elastic Stack Elastic Sta ...
- 从查询重写角度理解elasticsearch的高亮原理
一.高亮的一些问题 elasticsearch提供了三种高亮方式,前面我们已经简单的了解了elasticsearch的高亮原理; 高亮处理跟实际使用查询类型有十分紧密的关系,其中主要的一点就是muti ...
- elasticsearch学习笔记--原理介绍
前言:上一篇中我们对ES有了一个比较大概的概念,知道它是什么,干什么用的,今天给大家主要讲一下他的工作原理 介绍:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户 ...
- Elasticsearch学习总结--原理篇
一.概念 1.1 官方文档 以下总结自ElasticSearch的官方文档以及自己的一些实践,有兴趣的可以直接阅读官方文档: https://www.elastic.co/guide/en/elast ...
- Elasticsearch 技术分析(八):剖析 Elasticsearch 的索引原理
前言 创建索引的时候,我们通过Mapping 映射定义好索引的基本结构信息,接下来我们肯定需要往 ES 里面新增业务文档数据了,例如用户,日志等业务数据.新增的业务数据,我们根据 Mapping 来生 ...
- 十分钟搞懂Elasticsearch数字搜索原理
更多精彩内容请看我的个人博客或者扫描二维码,关注微信公众号:佛西先森 前言 Elasticsearch诞生的本意是为了解决文本搜索太慢的问题,ES会默认将所有的输入内容当作字符串来理解,对于字段类型是 ...
- Elasticsearch 分片路由原理指定分片存储查询
Elasticsearch 项目中使用到Es的父子结构.在数据填充之后,查看每个节点的数据分布情况,发现有的节点数据多,有的节点少的情况,在未使用Es父级结构之前,每个节点的数据分布还算平均,如下图: ...
- Elasticsearch的架构原理剖析
Elasticsearch 是最近两年异军突起的一个兼有搜索引擎和NoSQL数据库功能的开源系统,基于Java/Lucene构建.Elasticsearch 看名字就能大概了解下它是一个弹性的搜索引擎 ...
随机推荐
- 不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴. 聊着聊着突然说到他上午面试了一个工作6年的程序员, ...
- MySQL事务操作
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作.因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ...
- WebApiClient性能参考
1 文章目的 昨天写了走进WebApiClientCore的设计,介绍了WebApiClient的变化与设计之后,收到大家支持的.赞许的,还有好的建议和顾虑,比如WebApiClient性能怎么样,有 ...
- JavaScript实现栈结构
参考资料 一.什么是栈(stack)? 1.1.简介 首先我们需要知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据,而栈(stack)是一种受限的线性结构.以上可能比较难以理解,什么是受 ...
- PHP基础-自定义函数-变量范围-函数参数传递
一.自定义函数 function 函数名([形式参数1,形式参数2,....形式参数n]){ //各种PHP代码.... //...... return ...
- 3.CSS字体属性
CSS Fonts(字体)属性用定义字体系列,大小粗细,和文字样式(如斜体) 3.1字体系列 CSS使用font-family属性定义文本字体系列 p { font-family:'微软雅黑' ;} ...
- Java基础语法--分支结构
if-else 结构 if(条件表达式){ 执行代码块; } if(条件表达式){ 执行代码块; }else { 执行代码块; } if(条件表达式){ 执行代码块; }else if (条件表达式) ...
- 【SocketIoClientDotNet】Nuget包安装问题
问题: Nuget安装[SocketIoClientDotNet]失败 错误信息: Operation failed Expected 1 export(s) with contract name & ...
- Vue 百度地图显示规划路线
Vue 百度地图显示规划路线 1.首选引入相应的文件(建议单页面引入)(如有问题找上一篇博客园) 2.区别就是需要多引入几根不同的文件 import { BaiduMap, BmScale, BmGe ...
- [软件版本贴]SD.TEAM软件集
手机轰炸机-版本:v1.0.下载地址:http://pan.baidu.com/1.zip! 营销软件盒-版本:v1.0.下载地址:http://pan.baidu.com/2.zip! 不加群提取群 ...