目录
3.3、Spring框架与Elasticsearch的集成依赖包
问题现象:
最近在重温Elasticsearch,看来一下官网,都出到8.4.3版本了。想当初学的时候用的还是5.6.8,版本更新了很多意味着有大变动。
题外话(选看)
【在上网搜了很多文章,发现几乎都是Elasticsearch7.x的版本,然后就是文章内容虽然都有可取之处,但是可能不够详细,或者不知道是不是从哪里抄来的,很多细节问题没处理好,看得我不太适应。
我一向坚持写文章最好是原创,可以参考和引用别人的内容,但不应该生搬硬套,另外就是文章内容应该最大限度地经过自己的实践,结合自己的见解再去写文章,不应该人云亦云。
因为没有人能保证自己的观点一定是对的,或者说从现在到未来都是可用的。IT的发展和更迭是很非常快的,很多过去的观点和技术其实现在已经不适用了,是需要有人去尝新、积累和记录,才能推陈出新。
最后要说的一点就是不要害怕错误,要是发现有错误那就改过来,这也是一种进步;而且网上很多文章的作者其实对其文章内容很可能也只是一知半解罢了。我认为只要是经过实践和自己的思考发现的问题,那我们就继续去研究这个问题,最终得出的任何观点都是有价值的。对我而言写文章最重要的是能分享自己的学习经验,并和同行的人探讨,一起进步,这就能帮助他人也帮助自己,实现双赢。】
所以我基于Elasticsearch7.x的文章,结合自己的愚见和在Elasticsearch8.x的学习实践过程,特此整理出这篇Elasticsearch8.x的文章,希望大家多多指教。
那么今天就以8.4.0版本为例学习一下:
windows环境下如何安装Elasticsearch(8.4.0)!
【这里先说个题外话:Elasticsearch的search不是首字母大写的,我以前一直写成ElasticSearch,最近重温才发现人家官网写的是Elasticsearch】
解决方法:
1、Elastic官网下载Elasticsearch
这里我下载的是8.4.0的版本,地址是
点击红框所示的WINDOWS,即可开始下载zip压缩包:
下载完之后,解压到自定义位置(这里我解压到D:\elasticsearch-8.4.0\bin):
拓展:
如果想下载其他版本,可以修改url最后面的版本号即可
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-版本号(用-连接)
当然,如果不知道有哪些版本的,也可以访问以下url,使用官网提供的搜索功能:
Past Releases of Elastic Stack Software | Elastic
2、跨域配置
还需要注意的是Elasticsearch默认是不允许跨域访问的,因此如果我用其他服务访问es服务的时候会出现跨域访问的报错,如使用Head工具(端口9100)访问es服务(端口9200):
可以发现连接失败了,按f12进入开发者模式,可以看见报错
No 'Access-Control-Allow-Origin' header is present on the requested resource.
这是因为跨域了,而Elasticsearch默认是不允许跨域访问的,因此还需要给Elasticsearch的添加可跨域访问的配置。
打开Elasticsearch的config目录下的elasticsearch.yml文件,在结尾处添加如下配置并保存文件:
http.cors.enabled: true
http.cors.allow-origin: "*"
ingest.geoip.downloader.enabled: false
3、启动Elasticsearch
在bin目录下打开命令行窗口,输入命令:
elasticsearch
启动中:
启动结束:
可以看见绑定的端口号是9200,这里直接在浏览器访问url:
http://127.0.0.1:9200/http://127.0.0.1:9200/
出现如上图所示即为启动成功,红框里面可以看到一些基本信息和版本号。
3、Elasticsearch的使用方式
这里只是简单的提一下有哪些常见的使用方式,因为Elasticsearch的使用在各版本中基本上是没有什么区别,具体的使用过程很多文章都提到了,我就不一一赘述了,毕竟不是该文章的重点。
拓展:类型type的移除。
这里也要先提一下Elasticsearch的存储/体系结构,这样比较方便大家理解:
下表是ELasticsearch6.x之前的 Elasticsearch 与 MySQL 数据库逻辑结构概念的对比:
Elasticsearch | 关系型数据库 Mysql |
---|---|
索引(index) | 数据库(databases) |
类型(type) | 表(table) |
文档(document) | 行(row) |
当然,这个结构在Elasticsearch7.x之前是毫无争议的;但是从Elasticsearch7.x就变了,这都是因为官方要移除类型Type,为什么呢?在网上看到的一个解答是说:
Elasticsearch是基于Lucene的。
如果在一个 index 内存了多个 type,且这些 type 之间只有极少共用的字段,会使得数据过于离散,从而影响 Lucene 的压缩性能。
从ELasticsearch6.x开始,Elasticsearch 引入了一个参数控制 type 开关:include_type_name
=true,表示仍使用类型 type的概念。但每个索引只能存在一个类型type ,且官方推荐名为名字为【_doc】。
从ELasticsearch7.x开始,include_type_name=false,表示
已经移除了类型type的概念,但在使用过程中,仍需要在RESTful风格的url中,原本表示类型的那一层替换成_doc,至此【_doc】也被当成了是请求url涉及到类型type时的固定部分。
从ELasticsearch8.x开始,include_type_name属性被删除了。
所以我们不能也不需要再操作类型type了。
Elasticsearch的存储/体系结构现在也变成了:
Elasticsearch | 关系型数据库 Mysql |
---|---|
es服务 | 数据库(databases) |
索引(index) | 表(table) |
文档(document) | 行(row) |
但是我在使用HEAD可视化工具时,发现访问Elasticsearch8.4.0的界面上还会有名为【_doc】的类型:
当然,也有人认为目前还是要保持原来的存储/体系结构,原因如下:
1、由于文档都是具有index索引属性的,查询的时候都是需要带上index索引名的,不同索引下的文档数据依旧是相互独立的,因此索引的数据库作用依然存在。
2、不可能说我在一个mysql服务中创建多个数据库,对应的是要启动多个es服务(多个es服务需要占用多个端口)。所以es服务和mysql服务是一个量级(服务才需要占用端口),索引对应数据库(数据库不需要占用端口,它只是服务提供的一种存储结构),而一个es服务中创建多个索引index,相当于一个mysql服务中创建多个数据库。
我个人觉得变或不变都有一定的道理吧,我自己还是倾向于改变,比较官方的意愿就是想要移除类型Type,但现在的版本中是否真的已经实现了移除就很难确定了。
总结:不管怎么样,知道有这一回事,明白个中原因即可(也许面试的时候就会用得上)。
3.1、使用HEAD工具
使用HEAD工具可以实现可视化界面操作。需要安装HEAD插件,详情可参考我的另一篇文章:
3.2、使用Elastic官网推荐的Kibana工具
由于个人原因,这个工具我目前还未去使用和实践,但了解了一下和HEAD工具的作用类似,都是可以实现可视化界面操作。
3.3、Spring框架与Elasticsearch的集成依赖包
Spring框架中有集成了Elasticsearch的相关依赖;Elasticsearch中也有集成了Spring框架的相关依赖,需要根据Elasticsearch的版本,来选择使用不同的依赖包。
3.4、RESTful风格的url请求
Elasticsearch也是一个服务器,可以通过RESTful风格的url来发起请求。大家可以使用postman或者apipost等api调试软件来测试。如:
3.1.1、新建索引(端口后的第一层url就是索引)
PUT请求:http://127.0.0.1:9200/索引名/
测试:
拓展:
3.1.2、修改/创建文档(端口后的第二层url就是类型【表】,请求体就是文档【记录】)
PUT请求:http://127.0.0.1:9200/索引名/类型名
请求体:
{
"title": "文档id不存在是否会自动创建?",
"content": "文档id不存在会自动创建!"
}
需要注意的是,这个接口在Elasticsearch5.6.8是可以正常访问的,作用是创建类型,然后会在创建的类型中创建文档。
但是从ELasticsearch7.x开始就无法使用了,因为无法再操作类型了(在上文的存储/体系结构中有提到)。
现在调用的话会出现如下报错:
解法:
改为: http://127.0.0.1:9200/索引名/_doc
调用成功: